Re: [問題] virtual static function

看板C_and_CPP作者 (-858993460)時間15年前 (2010/10/06 16:34), 編輯推噓2(205)
留言7則, 3人參與, 最新討論串2/4 (看更多)
※ 引述《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)

10/06 16:37, , 1F
再寫一個接reference的function 這方法感覺還不錯
10/06 16:37, 1F

10/06 16:38, , 2F
畫蛇添足是因為我問題描述的很小...所以有更簡單的方法做
10/06 16:38, 2F

10/06 16:39, , 3F
事實上我要處理的問題不是這種小問題...只是透過個小問題
10/06 16:39, 3F

10/06 16:39, , 4F
來投石問路 謝謝你的解答
10/06 16:39, 4F

10/06 18:11, , 5F
就算用一個函式(By ref)包起來也沒辦法發揮多型效果喔
10/06 18:11, 5F

10/06 18:11, , 6F
:)
10/06 18:11, 6F

10/06 18:25, , 7F
隨手打的 code 沒有實際測過 囧 感謝樓上提醒
10/06 18:25, 7F
改寫成上篇 tinlans 提到的合成寫法 ※ 編輯: LPH66 來自: 140.112.30.140 (10/06 18:33)
文章代碼(AID): #1Ch3HzNj (C_and_CPP)
文章代碼(AID): #1Ch3HzNj (C_and_CPP)