看板 C_and_CPP 關於我們 聯絡資訊
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
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... 所以多型似乎是唯一解? 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)
tinlans:...完全不知道該從哪裡吐槽起,進 sort() 之前你就直接寫 10/06 16:51
tinlans:了 new xxx,代表你根本可以直接把 xxx 丟進 sort()。 10/06 16:51
tinlans:這種情況下哪裡還需要多型。 10/06 16:51
tinlans:真的需要彈性的話,古典的做法是設計函式的時候參數列多放 10/06 16:54
tinlans:一個參數,然後用 bind() 之類的方法去客製化,再丟給 10/06 16:55
tinlans:sort()。不然就是 functor + 合成的做法,不過自己要小心 10/06 16:56
tinlans:sort() 的 functor 是 by value 傳遞,你靠解構子釋放合成 10/06 16:57
tinlans:物時,記得 copy 要做好。 10/06 16:57
tinlans:簡單說 <algorithm> 的東西概念起源是 GP,你需要的東西並 10/06 17:00
tinlans:,真正起點並不是多型,而是一種叫 closure 的概念物。 10/06 17:00
tinlans: 多打了並 ^ 10/06 17:01
Hitmear:顯然T大誤會我的目的了 還是謝謝你的解答 10/06 17:44
tinlans:我沒有誤會吧,你不是要讓 user 可以選擇排序方法嗎? 10/06 18:09
tinlans:user可以根據喜好來選排序的依據 <---- 你的目的? 10/06 18:10
loveme00835:原po可以參考 std::tr1::ref、std::tr1::cref 10/06 18:15
loveme00835:使用 reference wrapper, 使得 sort 內部是用參考來參 10/06 18:15
loveme00835:考到你的物件, 而不是複製一個複本, 使得functor可以 10/06 18:16
loveme00835:達到多型的效果 10/06 18:16
tinlans:sort(v.begin(), v.end(), bind(f, _1, _2, xxx)); 10/06 18:17
tinlans:或是 sorter->setCompareStrategy(xxx), 10/06 18:19
tinlans:sorter 本身不具多型,xxx 才是多型物件。 10/06 18:19
tinlans:讓 sorter 把比較責任 delegate 給 xxx。 10/06 18:20
tinlans:方法一的話,也不需要什麼多型,直接上就好了。 10/06 18:21
tinlans:第二種方法就是讓 sorter 合成多型物件,再直接送 10/06 18:22
tinlans:sort(v.begin(), v.end(), sorter); 10/06 18:23
tinlans:雖然我才剛睡醒沒多久,不過概念上應該沒有問題。 10/06 18:23
tinlans:第二種方法,比較適合在你需要長時間保存 sorter 的狀況。 10/06 18:25
loveme00835:睡到剛剛阿..@_@ 還是composition 適合, 畢竟使用多型 10/06 20:37
loveme00835:負擔太大, 不然簡單的話其實多載一下就可以了... 10/06 20:38
Hitmear:原來如此 我看懂了 感謝 10/06 21:06