BOOL CUtilCtrl::SampWaveIn(long hWnd)
というコールバック関数があるとします。
ハンドラーコードからのディスパッチは
通常、どうすればいいのでしょうか?
...こんなんでええの?
#include <iostream>
#include <functional>
typedef bool BOOL;
class CUtilCtrl {
public:
BOOL SampWaveIn(long hWnd) {
std::cout << CUtilCtrl::SampWaveIn( << hWnd << )\n;
return true;
}
};
typedef std::function<BOOL(long)> handler;
class Kicker {
public:
void set_handle(handler h) { fun = h; }
bool kick(long arg) { return fun(arg); }
private:
handler fun;
};
int main() {
CUtilCtrl c;
Kicker k;
k.set_handle([&](long arg) -> BOOL { return c.SampWaveIn(arg); });
k.kick(123L);
}
さっそくのお返事、ありがとうございます。
BOOL SampWaveIn(long hWnd) {
std::cout << CUtilCtrl::SampWaveIn( << hWnd << )\n;
return true;
}
の中に、コードの実態を入れるのですね。
今、教えていただいたコードのままで、VS2005でコンパイルをかけたら、
下記のエラーが出てしまいました。
何か、やり方が悪いのでしょうか?
1>c:\R_R_F\S_R.cpp(14) : error C2039: 'function' : 'std' のメンバではありませ
ん。
1>c:\R_R_F\S_R.cpp(14) : error C2143: 構\u25991 文エラー: ';' が'<' の前にあり
ません。
1>c:\R_R_F\S_R.cpp(14) : error C4430: 型指定子がありません- int と仮定しまし
た。メモ: C++ はint を既定値としてサポートしていません
1>c:\R_R_F\S_R.cpp(18) : error C2061: 構\u25991 文エラー: 識別子'handler'
1>c:\R_R_F\S_R.cpp(21) : error C2146: 構\u25991 文エラー: ';' が、識別子'fun'
の前に必要です。
1>c:\R_R_F\S_R.cpp(21) : error C4430: 型指定子がありません- int と仮定しまし
た。メモ: C++ はint を既定値としてサポートしていません
1>c:\R_R_F\S_R.cpp(21) : error C4430: 型指定子がありません- int と仮定しまし
た。メモ: C++ はint を既定値としてサポートしていません
1>c:\R_R_F\S_R.cpp(18) : error C2065: 'fun' : 定義されていない識別子です。
1>c:\R_R_F\S_R.cpp(18) : error C2065: 'h' : 定義されていない識別子です。
1>c:\R_R_F\S_R.cpp(19) : error C3861: 'fun': 識別子が見つかりませんでした
1>c:\R_R_F\S_R.cpp(27) : error C2143: 構\u25991 文エラー: ')' が'[' の前にあり
ません。
1>c:\R_R_F\S_R.cpp(27) : error C2059: 構\u25991 文エラー: ']'
1>c:\R_R_F\S_R.cpp(27) : error C2143: 構\u25991 文エラー: ';' が'{' の前にあり
ません。
1>c:\R_R_F\S_R.cpp(27) : error C2065: 'arg' : 定義されていない識別子です。
1>c:\R_R_F\S_R.cpp(27) : error C2059: 構\u25991 文エラー: ')'
> 今、教えていただいたコードのままで、VS2005でコンパイルをかけたら、
> 下記のエラーが出てしまいました。
2005だから。2010,1012なら無問題。
単に、コールバック関数と言ったら範囲は広いよ。
ランタイムライブラリの
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
とかでcompareに渡す関数もコールバック関数の一種だし。
ディスパッチ,ハンドラ-とか言ってる時点で、ウィンドウメッセージとかの
やりとりのことを言ってるのかな?
情報が足りなくて憶測しかできない。
ウィンドウメッセージからメッセージハンドラ関数を呼び出す手順なら、その
ままMFCが参考になるけど、複雑怪奇なので理解するのはちと大変かも。
一言で言うなら、
あらかじめ連想配列を作成。
連想配列のキーをウィンドウメッセージ(UINT)、値をメッセージハンドラと
なる関数の関数ポインタにする。
そんだけ。
で、メッセージが飛んできたら、連想配列からメッセージハンドラの関数ポイ
ンタを取得して呼び出すと。