作者LPH66 (-858993460)
看板C_and_CPP
標題Re: [問題] virtual static function
時間Wed Oct 6 16:34:02 2010
※ 引述《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)