次のように、オブジェクトとメンバー関数ポインター (コールバック) を期待するフレームワーク関数があります。
do_some_work(Object* optr, void (Object::*fptr)()); // will call (optr->*fptr)()
ラムダ式を渡すにはどうすればよいですか? 次のようなことをしたい:
class MyObject : public Object
{
void mystuff()
{
do_some_work(this, [](){ /* this lambda I want to pass */ });
}
};
すべての意味は、MyObject クラスのインターフェースをコールバックで乱雑にしないことです。
UPDdo_some_work
フレームワークを制御していないため、まったく
改善できません。また、実際には 1 つの機能ではないため、何百もの機能があります。フレームワーク全体は、そのタイプのコールバックに基づいています。ラムダを使用しない一般的な使用例:
typedef void (Object::*Callback)();
class MyObject : public Object
{
void mystuff()
{
do_some_work(this, (Callback)(MyClass::do_work));
}
void do_work()
{
// here the work is done
}
};
解決策 Marcelo の回答に基づく私の解決策は次のとおりです。
class CallbackWrapper : public Object
{
fptr fptr_;
public:
CallbackWrapper(void (*fptr)()) : fptr_(fptr) { }
void execute()
{
*fptr_();
}
};
class MyObject : public Object
{
void mystuff()
{
CallbackWrapper* do_work = new CallbackWrapper([]()
{
/* this lambda is passed */
});
do_some_work(do_work, (Callback)(CallbackWrapper::execute));
}
};
CallbackWrapper を作成するので、コールバックが非同期で使用される場合の有効期間を制御できます。ありがとうございます。