非ブーストプロジェクトでは、特定のユーザーアクション(ボタンが押された/離された)に基づいてタイマーを使用するクラスがあります。このクラスをジェネリックにしたいので、ユーザー定義のアクションのコールバックを取ります。
// TimerClass.h
typedef void (*timerCallback)(void);
...
Class TimerClass : public CButton {
public:
void setCallbackShortTime(timerCallback clickFn) { shortCallback = clickFn;} ;
void setCallbackLongTime(timerCallback clickFn) { longCallback = clickFn;} ;
private:
timerCallback shortCallback, longCallback;
}
// CMyDlg.h
class CMyDlg : public CDialog
{
public:
void openLiveViewWindow();
void openAdminPanelWindow();
TimerClass _buttonSettings;
}
// CMyDlg.cpp
...
_buttonSettings.setCallbackShortTime(&openLiveViewWindow);
...
これで、別のクラス(DialogClass)からTimerClassを使用できますが、コールバック関数に関数ポインターを渡すことができません。これらの関数は静的ではありません。コンパイラは文句を言うことになります:
error C2276: '&' : illegal operation on bound member function expression
これに関するいくつかの研究が指摘しましたstd::function()
がstd::bind()
、私はこれらに精通しておらず、これを解決する方法についていくつかの指針をいただければ幸いです。
解決策:興味のある人のために、ここに最終的な解決策のレンガがあります
// TimedButton.h
#include <functional>
// define timer callback prototype
typedef std::function<void()> timerCallback;
...
class TimedButton : public CButton
{
public:
TimedButton();
...
void setCallbackShortTime(timerCallback clickFn) { _shortCallback = clickFn;} ;
void setCallbackLongTime(timerCallback clickFn) { _longCallback = clickFn;} ;
private:
timerCallback _shortCallback;
timerCallback _longCallback;
}
// TimedButton.cpp
...
(_longCallback)(); // call long duration fn
...
(_shortCallback)(); // call short duration fn
// in MyDlg.cpp
#include <functional>
...
_buttonSettings.setCallbackShortTime(std::bind(&CMyDlg::openLiveViewWindow, this));
_buttonSettings.setCallbackLongTime(std::bind(&CMyDlg::openAdminPanelWindow, this));