看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Hitmear (屍殌化液)》之銘言: : virtual 這關鍵字是為了polymorphism : 能夠在run-time的時後執行對的derive function : static 這關鍵字冠在function前是為不用產生instance即可使用 : 從字面上來看這兩者是有點衝突的 : 事實上,擺在一起也的確會得到一個compiler error : 請問有做法可以滿足讓function 又是virtual 又是static嗎? : ----- : 會有這疑問是因為想要使用<algorithm> 中的sort來排vector : 但又需要支援polymorphism 能夠在run-time根據不一樣的條件來換排法 : 語法是這樣 : vector<Data *> v; : ... : sort(v.begin(), v.end(), Sorter::cmp); : 當中的cmp 想要擁有polymorphism 的功能 : 網路上似乎沒有解 : 有人碰過類似的問題嗎? : 謝謝 : 推 nowar100:polymorphism是"物件"的特性 跟static扯在一起怪怪的 Orz 10/06 16:18 : 我知道怪怪的...但還是得這樣做.... : 推 LPH66:關鍵字: functor (雖然不是你要的 polymorphism 但該足夠了) 10/06 16:18 : → LPH66:說起來你要一個比較函式對什麼東西有 polymorphism? 10/06 16:19 : vector內的Data *有很多欄位,user可以根據喜好來選排序的依據 : 但是不想看到一堆if...else... : 所以多型似乎是唯一解? 如果這麼堅持 polymorphism 的話 這樣吧: class BaseComparator { public : virtual bool operator () (Data *, Data *) = 0; }; class ColumnOneComparator : public BaseComparator { public: bool operator () (Data *a, Data *b) { return a->ColumnOne < b->ColumnOne; } }; class ColumnTwoComparator : public BaseComparator { public: bool operator () (Data *a, Data *b) { return a->ColumnTwo < b->ColumnTwo; } }; class CompositeComparator { BaseComparator &C; public: CompositeComparator(BaseComparator &c):C(c){} bool operator ()(Data *a, Data *b){return C(a,b);} }; void LetMeSortThatForYou(vector<Data *> &v, BaseComparator &c) { sort(v.begin(), v.end(), CompositeComparator(c)); } ///////// LetMeSortThatForYou(mydata, ColumnOneComparator()); LetMeSortThatForYou(hisdata, ColumnTwoComparator()); -- 如果不是類似這種需求的話 其實只要直接在 sort 裡丟一個 functor 進去即可 不必動到 polymorphism 像是 sort(data.begin(), data.end(), ColumnOneComparator()); 這樣 也就是只要上面的 ColumnOneComparator 等 class 不必繼承也不必有 BaseComparator 真的需要 polymorphism 的只會在像這種(就我看來有點畫蛇添足)的情形..... -- 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町つぐみ 1994/05/21 高江 ミュウ 1995/04 歡迎來到 星野遊々 1997/03/24 守野いづみ 1997/03/24 伊野瀬チサト 1998/06/18 守野くるみ 1999/10/19 打越鋼太郎的 楠田ゆに 2000/02/15 樋口遙 2002/ 12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 2011/04/02 ∞與∫的世界 茜崎空啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞事故 2019/04/01~07 某大學合宿 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.140 ※ 編輯: LPH66 來自: 140.112.30.140 (10/06 16:34)
Hitmear:再寫一個接reference的function 這方法感覺還不錯 10/06 16:37
Hitmear:畫蛇添足是因為我問題描述的很小...所以有更簡單的方法做 10/06 16:38
Hitmear:事實上我要處理的問題不是這種小問題...只是透過個小問題 10/06 16:39
Hitmear:來投石問路 謝謝你的解答 10/06 16:39
loveme00835:就算用一個函式(By ref)包起來也沒辦法發揮多型效果喔 10/06 18:11
loveme00835::) 10/06 18:11
LPH66:隨手打的 code 沒有實際測過 囧 感謝樓上提醒 10/06 18:25
改寫成上篇 tinlans 提到的合成寫法 ※ 編輯: LPH66 來自: 140.112.30.140 (10/06 18:33)