1

テンプレート化されたメンバー関数をテンプレート パラメーターとして受け入れようとしています。

たとえば、次のクラスがあるとします。

class A
{
public:
    template<typename... Args>
    void Foo(Args...) {}

    void Bar() {}
};

私は呼び出すことができるようにしたい:

Invoke<&A::Foo>(5, true);

そして、これは次の呼び出しに似ています。

A a;
a.Foo(5, true);

私はこれを行う方法を知っていますBar():

template<void (A::*F)()>
void Invoke()
{
    A a;
    (a.*F)();
}

int main()
{
    Invoke<&A::Bar>();
}

これをテンプレート化されたメンバー関数ポインターに拡張することは可能ですか? または同様に、任意のパラメーター型を持つ関数を処理できるこのような転送関数を作成します。これは機能しませんが、次のようなものです。

template<typename... Args, void (A::*F)(Args...)>
void Invoke(Args... args)
{
    A a;
    (a.*F)(args...);
}

これが不可能な理由はわかりますが、もしそれが本当なら、その理由の基準を教えていただけますか? また、規格の詳細についても学習しようとしています。

4

1 に答える 1

2

これをテンプレート化されたメンバー関数ポインターに拡張することは可能ですか?

いいえ。ただし、特定のインスタンス化が必要な場合は、Fooを使用できますInvoke<&A::Foo<int, bool>>

または同様に、任意のパラメーター型を持つ関数を処理できるこのような転送関数を作成します。

さまざまな署名を操作できるInvokeようにするには、あらゆる種類の呼び出し可能なオブジェクトを操作するように変更する必要があります。次に、実際の関数を呼び出す呼び出し可能なオブジェクトを定義する必要があります。

struct callable_foo
{
    explicit callable_foo( A& obj ) : _obj( obj ){}

    template< typename ...Args >
    void operator ()( Args&&... args )
    {
         _obj.Foo( std::forward< Args >( args )... );
    }

    A& _obj;
}
于 2013-01-05T20:03:41.130 に答える