2016-05-07 8 views
-1

私は、いくつかのよく知られているデザインパターンを実装することによって、いくつかの基本的なC++ 11の概念を学ぼうとしています。現在、C++で新しいAngular2 EventEmitterパターンを実装しようとしているうちに、Callableに悩まされています。 コメントはすべてがOKであるとどまるのであれば、ここのコードです:静的メンバー関数なしでstd :: bindを使用するには?

class Controller { 

public: 

Controller() { 
    const pattern::EventEmitter<SwitchEvent> listner; 
    listner.subscribe([this](const SwitchEvent& event) { 
     if(event.get_state()) { 
      this->_count++; 
      std::cout << "count: " << this->_count << std::endl; 
     } 
    }); 
    //listner.subscribe(std::bind(&Controller::track, this)); 
} 

private: 

int _count = 0; 

void track(const SwitchEvent& event) { 
    if(!event.get_state()) { 
     this->_count++; 
     std::cout << "count: " << this->_count << std::endl; 
    } 
} 

}; 

と期待通りの出力がある:

$ g++ -std=c++11 -Wall test.cc 
$ ./a.out 
count: 1 

しかし、私はコメントを削除すると、私はエラーを取得:

test.cc: In constructor ‘Controller::Controller()’: 
test.cc:50:62: error: no matching function for call to ‘pattern::EventEmitter<SwitchEvent>::subscribe(std::_Bind_helper<false, void (Controller::*)(const SwitchEvent&), Controller*>::type) const’ 
    listner.subscribe(std::bind(&Controller::track, this)); 
                 ^
test.cc:50:62: note: candidate is: 
In file included from test.cc:1:0: 
EventEmitter.hh:16:6: note: void pattern::EventEmitter<T>::subscribe(const std::function<void(const T&)>&) const [with T = SwitchEvent] 
void subscribe(const std::function<void(const T&)>& listener) const { 
^
EventEmitter.hh:16:6: note: no known conversion for argument 1 from ‘std::_Bind_helper<false, void (Controller::*)(const SwitchEvent&), Controller*>::type {aka std::_Bind<std::_Mem_fn<void (Controller::*)(const SwitchEvent&)>(Controller*)>}’ to ‘const std::function<void(const SwitchEvent&)>&’ 
+0

g ++のどのバージョンですか? --std = C++ 14は役に立ちますか? –

答えて

4

bindには、引数を取ることがわかるようにプレースホルダーを指定する必要があります。

listner.subscribe(std::bind(&Controller::track, this, std::placeholders::_1)); 

それ以外の場合、nullary関数オブジェクトが返されますが、std::functionを構築することはできません。

1

"second"引数をイベントのtrack()に渡す必要があります。 thisにバインドする最初の引数ですが、2番目の引数がありません。

using namespace std::placeholders; 
listner.subscribe(std::bind(&Controller::track, this, _1)); 
1

あなたがC++ 11としてタグ付けされているので、あなたがラムダを使用する方が良いでしょう:

listner.subscribe([this](const SwitchEvent& event) { 
    if(!event.get_state()) { 
    _count++; 
    std::cout << "count: " << _count << std::endl; 
}}); 

それ以外の場合はトラックパラメータのプレースホルダを使用し、eventですから、このようなものが必要:

listner.subscribe(std::bind(&Controller::track, this, std::placeholders::_1)); 
関連する問題