[問題] virtual static function

看板C_and_CPP (C/C++)作者 (屍殌化液)時間15年前 (2010/10/06 16:12), 編輯推噓3(3030)
留言33則, 5人參與, 最新討論串1/4 (看更多)
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 的功能 網路上似乎沒有解 有人碰過類似的問題嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.124.182.185

10/06 16:18, , 1F
polymorphism是"物件"的特性 跟static扯在一起怪怪的 Orz
10/06 16:18, 1F
我知道怪怪的...但還是得這樣做....

10/06 16:18, , 2F
關鍵字: functor (雖然不是你要的 polymorphism 但該足夠了)
10/06 16:18, 2F

10/06 16:19, , 3F
說起來你要一個比較函式對什麼東西有 polymorphism?
10/06 16:19, 3F
vector內的Data *有很多欄位,user可以根據喜好來選排序的依據 但是不想看到一堆if...else... 所以多型似乎是唯一解? functor我知道他的用法 事實上我也有用仿函數的方式嘗試過 Sorter *sorter = new Sorter() 或者 new Sorter_Derived() 放入sort內 sort(v.begin(), v.end(), *sorter); 無論是new 哪個instance 都是一樣用Base class的functor 代入 這不是我要的 ※ 編輯: Hitmear 來自: 140.124.182.185 (10/06 16:29)

10/06 16:51, , 4F
...完全不知道該從哪裡吐槽起,進 sort() 之前你就直接寫
10/06 16:51, 4F

10/06 16:51, , 5F
了 new xxx,代表你根本可以直接把 xxx 丟進 sort()。
10/06 16:51, 5F

10/06 16:51, , 6F
這種情況下哪裡還需要多型。
10/06 16:51, 6F

10/06 16:54, , 7F
真的需要彈性的話,古典的做法是設計函式的時候參數列多放
10/06 16:54, 7F

10/06 16:55, , 8F
一個參數,然後用 bind() 之類的方法去客製化,再丟給
10/06 16:55, 8F

10/06 16:56, , 9F
sort()。不然就是 functor + 合成的做法,不過自己要小心
10/06 16:56, 9F

10/06 16:57, , 10F
sort() 的 functor 是 by value 傳遞,你靠解構子釋放合成
10/06 16:57, 10F

10/06 16:57, , 11F
物時,記得 copy 要做好。
10/06 16:57, 11F

10/06 17:00, , 12F
簡單說 <algorithm> 的東西概念起源是 GP,你需要的東西並
10/06 17:00, 12F

10/06 17:00, , 13F
,真正起點並不是多型,而是一種叫 closure 的概念物。
10/06 17:00, 13F

10/06 17:01, , 14F
多打了並 ^
10/06 17:01, 14F

10/06 17:44, , 15F
顯然T大誤會我的目的了 還是謝謝你的解答
10/06 17:44, 15F

10/06 18:09, , 16F
我沒有誤會吧,你不是要讓 user 可以選擇排序方法嗎?
10/06 18:09, 16F

10/06 18:10, , 17F
user可以根據喜好來選排序的依據 <---- 你的目的?
10/06 18:10, 17F

10/06 18:15, , 18F
原po可以參考 std::tr1::ref、std::tr1::cref
10/06 18:15, 18F

10/06 18:15, , 19F
使用 reference wrapper, 使得 sort 內部是用參考來參
10/06 18:15, 19F

10/06 18:16, , 20F
考到你的物件, 而不是複製一個複本, 使得functor可以
10/06 18:16, 20F

10/06 18:16, , 21F
達到多型的效果
10/06 18:16, 21F

10/06 18:17, , 22F
sort(v.begin(), v.end(), bind(f, _1, _2, xxx));
10/06 18:17, 22F

10/06 18:19, , 23F
或是 sorter->setCompareStrategy(xxx),
10/06 18:19, 23F

10/06 18:19, , 24F
sorter 本身不具多型,xxx 才是多型物件。
10/06 18:19, 24F

10/06 18:20, , 25F
讓 sorter 把比較責任 delegate 給 xxx。
10/06 18:20, 25F

10/06 18:21, , 26F
方法一的話,也不需要什麼多型,直接上就好了。
10/06 18:21, 26F

10/06 18:22, , 27F
第二種方法就是讓 sorter 合成多型物件,再直接送
10/06 18:22, 27F

10/06 18:23, , 28F
sort(v.begin(), v.end(), sorter);
10/06 18:23, 28F

10/06 18:23, , 29F
雖然我才剛睡醒沒多久,不過概念上應該沒有問題。
10/06 18:23, 29F

10/06 18:25, , 30F
第二種方法,比較適合在你需要長時間保存 sorter 的狀況。
10/06 18:25, 30F

10/06 20:37, , 31F
睡到剛剛阿..@_@ 還是composition 適合, 畢竟使用多型
10/06 20:37, 31F

10/06 20:38, , 32F
負擔太大, 不然簡單的話其實多載一下就可以了...
10/06 20:38, 32F

10/06 21:06, , 33F
原來如此 我看懂了 感謝
10/06 21:06, 33F
文章代碼(AID): #1Ch2zdA7 (C_and_CPP)
文章代碼(AID): #1Ch2zdA7 (C_and_CPP)