注: 次のコード例は実際のコードではありません。実際のコードをここに貼り付けると、はるかに複雑になるため、この例はばかげているように見えるかもしれませんが、重要ではありません。
struct Base
{
void beginEvent(int a)
{
impl(a, &Base::onBeginEvent, &Base::onBeginEvent);
}
void endEvent(int a)
{
impl(a, &Base::onEndEvent, &Base::onEndEvent);
}
void impl(int a, void (Base::*func1)(int), void (Base::*func2)(int, int))
{
//some complicated behavior
//...
(this->*func1)(a);
(this->*func2)(a, -a);
}
virtual void onBeginEvent(int a){}
virtual void onBeginEvent(int a, int negativeA){}
virtual void onEndEvent(int a){}
virtual void onEndEvent(int a, int negativeA){}
};
と
struct Derived : public Base
{
void onBeginEvent(int a) { std::cout << a << "\n"; }
void onEndEvent(int a, int b) { std::cout << a << "==(-(" << b << "))\n"; }
};
int main()
{
Derived d;
d.beginEvent(3);
d.endEvent(9);
return 0;
}
私の質問は、それが1つのメンバー関数ポインターであることを知っていても(この場合)、それimpl
が取る方法で関数を定義することが本当に必要ですか?void (Base::*func1)(int)
void (Base::*func2)(int, int)
&Base::onBeginEvent
それらの1つだけを提供すると、明らかに応答が少なすぎます。呼び出すときに多くの引数に。可変長関数などは必要ありません。Base が Derived に提供できる有限数のメソッドが必要です。Derived は、提供されたメソッドの 1 つだけ、または任意のサブセットを呼び出すことができます。しかし、私は知っています、それらは同じシンボルの単なるオーバーロードになります。私の目標は、いくつかのクレイジーな回避策で動作させることではありません。投稿されたコードを減らすことができるかどうかを知りたいだけです。
私の実際のコードでのEDIT Thme impl メソッドは非常に複雑です。begin と end は同じですが、impl の最後に別の呼び出しがあるだけです...