現在、C++ 0xのイベントハンドラシステムに書き込みを行っています。 std::function
オブジェクトに格納できるあらゆる種類の関数/メソッドを渡すことによって、各イベント(複数のハンドラが存在する可能性があります)の「ハンドラ」が登録されます。これは、オーバーロードされた+ =演算子を使用してC#スタイルで行われます。今、私はベクトルに保存されているstd::function
オブジェクトから実際の関数ポインタを取得するための別の内部メソッドを持ってC++ 0x:std :: function :: targetとのエラーとテンプレート引数
template<typename THandlerReturn, typename THandlerArgs...>
class Event {
public:
typedef THandlerReturn(HandlerSignature)(THandlerArgs...);
typedef THandlerReturn(*HandlerFuntionPtr)(THandlerArgs...);
typedef typename std::function<HandlerSignature> HandlerFunction;
void operator += (HandlerFunction handler) {
_handlers.push_back(handler);
}
// Some other methods for calling all handlers, ctors, etc.
private:
std::vector<HandlerFunction> _handlers;
};
:私のイベントクラスは、この(読みやすくするために取り除か)のように、基本的に見えます。これは基本的に次のようなことを試みます:
// Preceeding: Get an iterator 'it' from the vector
HandlerFunctionPtr pt2func = it->target<HandlerSignature>();
この時点で、アプリケーションでEventクラスを使用すると、コンパイルは失敗します。 GCC 4.7のビルドを使用して、私は、上記の行のために、次のエラーメッセージが出ます:戻り値の型がvoid
であると仮定すると、私はtarget<>()
方法と完全に以下の作品と少しテストしてみた
error: expected primary-expression before '>' token
error: expected primary-expression before ')' token
を一つありますタイプint
の引数:
typedef THandlerReturn(Signature)(int);
typedef THandlerReturn(*FunctionPtr)(void);
std::function<Signature> func;
FunctionPtr pt2func = func.target<Signature>();
:
typedef void(Signature)(int);
typedef void(*FunctionPtr)(int);
std::function<Signature> func;
FunctionPtr pt2func = func.target<Signature>();
しかし、すぐに関与する1つのテンプレート引数があるとして、私は上記の投稿のエラーを取得します
誰かが実際にその理由を教えてもらえますか?もしそうなら、それを動作させる方法があれば教えてください。どんな助けや洞察もありがとう!前もって感謝します!
うわー、ありがとう!それはトリックでした! :)ああ、私は、テンプレートキーワードがそうすることができ、そうしなければならないことをイベントでは知りませんでした。再度、感謝します! :) – PuerNoctis
余分な説明とリンクをありがとう – PuerNoctis