推 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