関数を含むベクトルを作成しましたが、引数リストがありませんでした。また、彼らはクラスの中にいませんでした。という名前のクラスがDialog
あり、関数ポインタを特定のシグネチャで保存する必要があります。これらの関数の typedef は次のとおりです。
typedef INT_PTR (*MsgHandler)(WPARAM,LPARAM);
しかし、これらMsgHandler
の を含むベクトルは私のクラスにあり、それは私のDialog
クラスに継承されるためCMainWnd
、関数を push_back しようとすると、関数の署名は の署名とは異なりMsgHandler
ます。ここに私のコード、ベクトル内の関数を push_back しようとする 4 つのバリエーション、およびそれぞれの結果のエラーがあります。
typedef INT_PTR (*MsgHandler)(WPARAM,LPARAM);
class Dialog
{
protected:
Dialog(void); // Must be inherited
vector<MsgHandler> Handlers;
}
class CMainWnd : public Dialog
{
public:
INT_PTR MyHandler(WPARAM wp, LPARAM lp) {
return TRUE;
}
CMainWnd(void) {
// Attempt 1: Handlers.push_back(MyHandler);
// Attempt 2: Handlers.push_back(&MyHandler);
// Attempt 3: Handlers.push_back(CMainWnd::MyHandler);
// Attempt 4: Handlers.push_back(&CMainWnd::MyHandler);
}
};
試行 1 で次のエラーが発生します。
error C3867: 'CMainWnd::MyHandler': function call missing argument list; use '&CMainWnd::MyHandler' to create a pointer to member
試行 2 の結果:
error C2276: '&' : illegal operation on bound member function expression
試行 3 歩留まり:
error C3867: 'CMainWnd::MyHandler': function call missing argument list; use '&CMainWnd::MyHandler' to create a pointer to member
試行 4 歩留まり:
error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'INT_PTR (__thiscall CMainWnd::* )(WPARAM,LPARAM)' to 'const MsgHandler &'
試行 4 が正しいことに最も近いと思いますが、前述のように、関数はメンバーであるため、署名が変更されます。継承されたクラスで定義されているベクトルに関数ポインターを格納するにはどうすればよいですDialog
か。
- 戻り値の型を持つ
INT_PTR
- 2 つのパラメーターを持ちます。最初のパラメーターは で
WPARAM
、2 番目のパラメーターは です。LPARAM
- コンストラクターがそれらをベクターに追加するものである派生クラスのメンバーである
このようなことを行うために使用することを聞いたことがありboost::function
ますが、ドキュメントを調べましたが、使用方法がわかりません。すべてが混乱しているようです。バインド操作などでコードを行き詰まらせるのではなく、変数であるかのように関数をベクトルに追加したいだけです。(ブースト機能に関しては、私が無知だからかもしれません)。
ここで何が間違っていますか、またはboost::function
これを行うために使用できますか? boost::function
ちなみにベクターを as と宣言して足し算vector<boost::function<INT_PTR(WPARAM,LPARAM)>>
しMyHandler
てみましたがだめでした。必要がない場合はブーストを使用したくないのですが、誰かがこれを行うブースト方法を提案している場合は、どうすればこれを行うことができるかを明確にしてください。