Re: [問題] virtual static function
※ 引述《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
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
10/06 18:11, 5F
→
10/06 18:11, , 6F
10/06 18:11, 6F
→
10/06 18:25, , 7F
10/06 18:25, 7F
改寫成上篇 tinlans 提到的合成寫法
※ 編輯: LPH66 來自: 140.112.30.140 (10/06 18:33)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):