1

注: 次のコード例は実際のコードではありません。実際のコードをここに貼り付けると、はるかに複雑になるため、この例はばかげているように見えるかもしれませんが、重要ではありません。

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 の最後に別の呼び出しがあるだけです...

4

2 に答える 2

0

あなたは言う...the way it takes void (Base::*func1)(int) and void (Base::*func2)(int, int) even though I know that it is one member function pointer...、そして誰があなたに両方が1つの機能であると言いましたか? 2 つの関数が同じ名前を持っているからといって、それらが同じ関数であるとは限りません。住所も名前以外も全部違います。したがって、それらは1つの機能ではなく2つの異なる機能です

于 2012-10-20T14:29:27.420 に答える