推 tomap41017:推C++0x 10/25 12:07
※ 引述《jackwei (吐司)》之銘言:
: 感謝 firejox, legnaleurc, loveme00835 版友的幫忙
: 根據大家提供的關鍵字
: 我在網路上找到這份資料解決了我的問題
: http://0rz.tw/hsD8F
: 簡單說就是用 functor 來取代 function (我也不太懂 第一次接觸這個東西)
: 還是不太知道為什麼 member function 必須是 static
: 而用 functor 卻不用
重點不是 functor, 而是 "member"
member function 要怎麼 call? 一定是如下形式
this->method( ... )
但是光用 &SA::method, 編譯器只知道這是 SA 的一個 member function pointer
卻不知道 this 指向哪裡? 是哪個 object 要做這個 member function call?
而 static member function 就沒這個問題, 因為它只是一個可以
存取 SA 所有 member 的普通 function 而已
: 至於怎麼像 legnaleurc 版友說的 bind 一個 instance
: 可以麻煩再給多一點說明嗎 謝謝
: 用在我的例子 code 如下
: class SA
: {
: ....
: struct doCompare
: {
: const SA& mySA;
: doCompare(const SA& sa) : mySA(sa) {}
: bool operator() (const int &i, const int &j){
: return mySA.Gij[mySA.tempCompareStandard][i] >
: mySA.Gij[mySA.tempCompareStandard][j];
: }
: };
: .....
: };
: void SA::SomeFunction()
: {
: .....
: for(int i=0;i<size;i++)
: {
: for(int j=0;j<size;j++) gainListSorted[i][j] = j;
: tempCompareStandard = i;
: sort(gainListSorted[i], gainListSorted[i]+size, doCompare(*this));
: }
: .....
: }
sort( begin, end, std::bind(
&SA::compare,
this,
std::placeholder::_1,
std::placeholder::_2 ) );
(舊一點的 compiler 要用 std::tr1, 再舊一點的只能用 boost)
這樣基本上是達成了你原本要用 member function 做 comparator 的目的
原理跟你這篇的寫法差不多, 只是會少寫一些 code
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.37.36.138
※ 編輯: legnaleurc 來自: 114.37.36.138 (10/25 03:17)