7

我試圖按照Bjarne Stroustups解釋function模板。C++ 0x函數<>,綁定和成員

struct IntDiv { // functor 
    float operator()(int x, int y) const 
    { return ((float)x)/y; } 
}; 

// function pointer 
float cfunc(int x, int y) { return (float)x+y; } 

struct X { // member function 
    float mem(int x, int y) const { return ...; } 
}; 
using namespace placeholders; // _1, _2, ... 

我要分配到:我專門用C函數指針函子lambda表達式成員函數指針

的互換性鑑於defintions發揮function<float(int,int)>一切皆有可能:

int main() { 
    // declare function object 
    function<float (int x, int y)> f; 
    //== functor == 
    f = IntDiv{}; // OK 
    //== lambda == 
    f = [](int x,int y)->float { return ((float)y)/x; }; // OK 
    //== funcp == 
    f = &cfunc; // OK 

    // derived from bjarnes faq: 
    function<float(X*,int,int)> g; // extra argument 'this' 
    g = &X::mem; // set to memer function  
    X x{}; // member function calls need a 'this' 
    cout << g(&x, 7,8); // x->mem(7,8), OK. 

    //== member function == 
    f = bind(g, &x,_2,_3); // ERROR 
} 

最後一行給出了一個典型的不可讀的編譯器模板錯誤。 感嘆

我想將f綁定到現有的x實例成員函數,以便只剩下簽名float(int,int)

應該是什麼線,而不是

f = bind(g, &x,_2,_3); 

......或者還有什麼地方是錯誤?


背景:

這裏談到Bjarnes例如使用bindfunction一個成員函數:

struct X { 
    int foo(int); 
}; 
function<int (X*, int)> f; 
f = &X::foo;  // pointer to member 
X x; 
int v = f(&x, 5); // call X::foo() for x with 5 
function<int (int)> ff = std::bind(f,&x,_1) 

以爲bind被這樣使用:將未分配的地方獲得placeholders,其餘填寫bind。如果_1堅果得到this,那麼?因此,最後一行是:

function<int (int)> ff = std::bind(f,&x,_2) 

在霍華德的建議下面我嘗試了:-) order of args in bind

+0

爲什麼不只是使用lambda? – Puppy 2011-05-29 19:41:51

+0

不錯! :-) ....... – 2011-05-31 13:14:03

回答

8
f = bind(g, &x,_1,_2); // OK 

佔位符是指在返回的綁定對象的參數位置。請勿索引g的參數。

+0

哦,太棒了,我錯過了,直到現在。我認爲我需要爲此畫圖,因爲我需要自己解釋。 – towi 2011-05-30 08:04:58

+0

如果你想知道如何在這裏發佈那個圖畫,那會很棒!我相信這會幫助很多人! :-) – 2011-05-31 01:33:12