作者minazukimaya (水无月真夜)
看板C_and_CPP
标题Re: [语法] STL sort 在一个 Class 里面含很多priv …
时间Mon Oct 5 17:11:17 2009
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 114.32.15.163
: → adrianshum:我觉得这样只不过是把那你口中那十个 functor的 code 10/05 12:04
: → adrianshum:用另一种形式写出来吧了, 没省多少东西... 10/05 12:05
: → minazukimaya:十个functor变一个functor总比写十遍好吧.. 10/05 12:39
: → minazukimaya:确实,如果你十个都有用到 compiler真的会具现化 10/05 12:39
: → minazukimaya:十个functor出来 但是写一个总比写十个简单.. 10/05 12:40
: → minazukimaya:template的精义就在於叫compiler帮你写code啊XDD 10/05 12:41
: → adrianshum:重点是没有省多少 code 呀... 所谓重覆的部份也只是 10/05 16:10
: → adrianshum:class XXX { public boolean operator < (const Y&){}} 10/05 16:11
: → minazukimaya:好处多多啊 1.十行变一行 2.避免duplicate code产生 10/05 16:27
: → minazukimaya:3.如果你宣告十个functor compile就会生十个给你 10/05 16:28
: → minazukimaya:但是template是你真的有用到才会产生 10/05 16:28
: 推 Fenikso:template配什麽enum.. 要放也是放member function pointer 10/05 16:30
: → minazukimaya:如果你真的写十个functor出来 以後要是functor功能 10/05 16:31
: → minazukimaya:要改 一口气要改十个地方耶XD 10/05 16:31
: 推 Fenikso:你这样跟写十个不同名字的getter有什麽不同 10/05 16:36
: → minazukimaya:是他们教授说要用template完成耶XD 啊不然我也知道 10/05 16:37
: → minazukimaya:用boost::bind一个functor都不用写 10/05 16:38
: → minazukimaya:另外,和前述一样的道理 你写十个getter就是十个都 10/05 16:41
: → minazukimaya:会存在 但是template member function是需要的时侯 10/05 16:41
: → minazukimaya:才会产生出来的 10/05 16:41
: 推 Fenikso:comparator写成template就好啦 getter写成template一点用 10/05 16:42
: → Fenikso:都没有 10/05 16:42
: → minazukimaya:好处是function call成本比较低啊 当然缺点就是灵活 10/05 16:50
: → minazukimaya:度比较差 10/05 16:50
: → adrianshum:最大问题是把本来的class 污染了, 用 external functor 10/05 16:52
: → adrianshum:其中一个原因就是想改 sorting criteria 的时候不需改 10/05 16:52
: → adrianshum:model, 但这做法, 每加一个就要改一次 model 10/05 16:53
加上getXXX()的做法也是每加一次要改一次model啊..
同样都是污染原本的class
为什麽你为认为加十个getter比加一个template function污染得少呢?
要提取class其中的private成员 本来就势必要在class里面加东西
两者的差别只在你加的是member function还是template member function而已
: → adrianshum:根本和写十个 compare_by_Xxx() compare_by_Yyy() 无异 10/05 16:53
class LessThanByXXX {
public:
bool operator() (GNF& lhs,GNF& rhs) { return lhs.getXXX()<rhs.getXXX();}
};
这样写十个 和
template <GNF::SortBy T>
class LessThanBy {
public:
bool operator() (GNF& lhs,GNF& rhs) { return lhs.getAttr<T>() < rhs.getAttr<T> ();}
}
写十个前者到底哪里比较好..
除了增加code的长度和降低维护性之外..
写十个functor然後每个functor只差9个字元 这样真的比较好吗
: → adrianshum:另, functor 的功能要改, 这个根本不成立吧. 到头来 10/05 16:5
: → adrianshum:省到的就是我说的那两句, 换来的是 model 被污染, code 10/05 16:5
: → adrianshum:变得难理解. 值得吗? 还不要说要是要compare两个field 10/05 16:5
: → adrianshum:的话, 这做法也行不通 10/05 16:5
template <GNF::SortyBy T, GNF::SortyBy T>
不就好了吗.. 如果你嫌麻烦不想写还可以加个预设引数呢
这种需求不写成template
难道要写10*9 = 90个LessThanByXXX_AND_YYY()吗...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.15.163
※ 编辑: minazukimaya 来自: 114.32.15.163 (10/05 17:31)