Re: [語法] STL sort 在一個 Class 裡面含很多priv …
看板C_and_CPP (C/C++)作者minazukimaya (水無月真夜)時間16年前 (2009/10/05 17:11)推噓0(0推 0噓 0→)留言0則, 0人參與討論串3/6 (看更多)
: ※ 發信站: 批踢踢實業坊(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)
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 3 之 6 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章