Event
構造体と、構造体によって知られている特定の名前とプロトタイプを持つ関数を実装するオブジェクトが与えられた場合Event
、ポインターを返すか、その関数にバインドします。正確に何が返されるかは重要ではありません。それは、メンバー関数へのポインターまたはバインドと同じくらい簡単になります。
説明するのは少し難しいので、ここにいくつかの疑似コードがあります:
struct Foo {
void onEvent();
};
struct Bar {
void onEvent();
};
struct Event
{
// I'm not sure what would go here
// Needs something that can be used to resolve T::onEvent, without
// knowing what T is until GetEventFunction is called.
typedef std::function<void()> function_type;
};
template<typename T, typename EventType>
EventType::function_type GetEventFunction(T* object)
{
return std::bind(T::(EventType::Something), object);
}
GetEventFunction<Foo, Event>(new Foo); // Returns Foo::onEvent
GetEventFunction<Bar, Event>(new Bar); // Returns Bar::onEvent
この動作を実現できますか、それともC ++が制限されすぎてこれを許可できませんか?
答える前にこれを読んでください
私は反省を探していません。私の知る限り、私が目指していることを実行するために必要なすべての情報は、コンパイル時に利用できます。
また、私は別のアプローチには興味がありません。各イベントタイプのテンプレートの特殊化など、追加のコードを使用してこの動作を実現する多くの方法を知っていますが、これを具体的に実現する方法を探しています。