コールバック関数と、ディスパッチ ハンドラー コードの関係は?

[戻る]
かとう まさひこ 2013/04/27(土) 20:29:10
BOOL CUtilCtrl::SampWaveIn(long hWnd) 
というコールバック関数があるとします。
ハンドラーコードからのディスパッチは
通常、どうすればいいのでしょうか?

επιστημη [E-Mail] [HomePage] 2013/04/28(日) 13:40:32
...こんなんでええの?

#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);
}

いえやす 2013/04/28(日) 18:21:45
さっそくのお返事、ありがとうございます。

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 文エラー: ')'

επιστημη [E-Mail] [HomePage] 2013/04/28(日) 21:25:08
> 今、教えていただいたコードのままで、VS2005でコンパイルをかけたら、
> 下記のエラーが出てしまいました。

2005だから。2010,1012なら無問題。

bun 2013/05/01(水) 10:35:40
単に、コールバック関数と言ったら範囲は広いよ。
ランタイムライブラリの
void qsort(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(const void *, const void *) 
);
とかでcompareに渡す関数もコールバック関数の一種だし。

ディスパッチ,ハンドラ−とか言ってる時点で、ウィンドウメッセージとかの
やりとりのことを言ってるのかな?
情報が足りなくて憶測しかできない。

ウィンドウメッセージからメッセージハンドラ関数を呼び出す手順なら、その
ままMFCが参考になるけど、複雑怪奇なので理解するのはちと大変かも。

一言で言うなら、
あらかじめ連想配列を作成。
連想配列のキーをウィンドウメッセージ(UINT)、値をメッセージハンドラと
なる関数の関数ポインタにする。
そんだけ。

で、メッセージが飛んできたら、連想配列からメッセージハンドラの関数ポイ
ンタを取得して呼び出すと。

古いスレッドには追加発言できません。