2017-01-12 1 views
1

次は私のコードです:私が達成したい何std :: bindを使用してオブジェクトポインタparamと関数をバインドする方法はありますか?

class A {}; 
class Test 
{ 
public: 
    template <class TClass> 
    Test(TClass* _objPointer, void(TClass::*_func)(A*)) 
    { 
     mEventFunction = std::bind(_func, _objPointer); 
    } 
private: 
    std::function<void(A*)> mEventFunction; 
}; 

class Demo 
{ 
public: 
    void BindFunc() 
    { 
     mTest = new Test(this, &Demo::testFunc); 
    } 
    void testFunc(A*) 
    { 

    } 
private: 
    Test* mTest; 
}; 

はデモクラスに)BindFunc(です。しかし、エラーメッセージの多くのこのコードの実行: エラーC2672:「STD ::呼び出さない」:一致オーバーロードされた関数を を見つけた......

+3

'std :: bind(_func、_objPointer、std :: placeholders :: _ 1)'。 –

答えて

5

は、あなたはそのA*引数を考慮してstd::placeholders::_1を含める必要があなたはまだ拘束されていない:

#include <functional> 

class A {}; 
class Test 
{ 
public: 
    template <class TClass> 
    Test(TClass* _objPointer, void(TClass::*_func)(A*)) 
    { 
     mEventFunction = std::bind(_func, _objPointer, std::placeholders::_1); 
    } 
private: 
    std::function<void(A*)> mEventFunction; 
}; 

class Demo 
{ 
public: 
    void BindFunc() 
    { 
     mTest = new Test(this, &Demo::testFunc); 
    } 
    void testFunc(A*) 
    { 

    } 
private: 
    Test* mTest; 
}; 

Demo

を私はそれが私たちが代わりにラムダ(Demo2)を使用した場合、あなたがA*のためのいくつかのプレースホルダが必要であることを少し明確だと思う:

template <class TClass> 
Test(TClass* _objPointer, void(TClass::*_func)(A*)) 
{ 
    mEventFunction = [_objPointer, _func](A* _a){(_objPointer->*_func)(_a);}; 
} 

ここで、λはA*の引数を受け取ります。これはあなたが望むものです。ほぼすべての使用例で、λ30アプローチをstd::bind以上にすることを実際にお勧めします。

+1

ラムダを 'bind'するのが好きな人のための名誉です。 – NathanOliver

+0

ありがとう、これは素晴らしい答えです! – Yonghui

関連する問題