看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《BlackMatrix (BlackMatrix)》之銘言: : 現在我完全改進我的Functor, 變成 : : template <class C> : class LessThanByLat : { : public: : bool operator() (C lhs, C rhs) : { : return (lhs.getLat()<rhs.getLat()); : } : }; : : 跟 : : sort (GNF_vector.begin(), GNF_vector.end(), LessThanByLat<bool>()); : : 我想要我的vector裡面以LAT這個數字以大到小排列, 目前我這樣寫, 看看該怎麼辦 : 成功 : : 如果有想法的拜託請給點提示~~~~ (雖然我知道我上面那串Code寫錯了) : ※ 編輯: BlackMatrix 來自: 71.183.68.195 (10/05 04:55) : : 我解決這個問題了 : : class LessThanByLat : { : public: : bool operator() (GNF& lhs,GNF& rhs) : { : return (lhs.getLat()<rhs.getLat()); : } : }; : : sort (GNF_vector.begin(), GNF_vector.end(), LessThanByLat()); : : 謝謝各位的幫助 教授不是要你用template寫嗎@@ 你這樣寫的話 如果GNF這個class有十個attribute可供排序 你就要寫十個functor.. 所以教授的意思應該是要你用template產生functor 假設 class GNF { int attr1; double attr2; char attr3; public: } 你要做的事有 1. 在GNF裡面加個enum GNF::SortBy,來指出哪些變數可以用來Sort 2. 在GNF的public介面上加一個template member function getAttr<>() 用以提取private,當然你得為每個要提取的變數寫一個特化版本 3. 在GNF外面寫一個template functor 為各種attribute產生functor class GNF { int attr1; double attr2; char attr3; public: enum SortBy { ATTR1, ATTR2, ATTR3}; template<SortBy T> void getAttr() {}; // 主要模板 但是是空的 template<> int getAttr<ATTR1>() { return attr1; }; // 提供特化版本,下略 .... .... } 剩下的template functor的問題就交給你自己想了 如果一切順利 最後的用法應該像這樣 std::sort(GNF_vector.begin(), GNF_vector.end(), LessThanBy<ATTR1> ); -- ※ 發信站: 批踢踢實業坊(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
adrianshum:根本和寫十個 compare_by_Xxx() compare_by_Yyy() 無異 10/05 16:53
adrianshum:另, functor 的功能要改, 這個根本不成立吧. 到頭來 10/05 16:55
adrianshum:省到的就是我說的那兩句, 換來的是 model 被污染, code 10/05 16:55
adrianshum:變得難理解. 值得嗎? 還不要說要是要compare兩個field 10/05 16:56
adrianshum:的話, 這做法也行不通 10/05 16:56