1

AngelScript メソッドを「ラップ」するクラスがあります。基本的に、クラス、メソッドの戻り値の型、メソッドへのポインター、および引数のリストを送信します。

Methodこれまでのところ、パラメーターを取らないクラス メソッドを「バインド」しているときに、このオブジェクトを正常に作成できました。ただし、パラメーターを追加しようとすると、壊れます。

私はこのようなことをしています:

template<typename C, typename R, R (C::*fn)(), typename... Arguments>
class Method {
public:
    Method()
    {
        const asSFuncPtr& func = asSMethodPtr<sizeof( void (C::*)() )>::Convert( AS_METHOD_AMBIGUITY_CAST( R (C::*)(Arguments... parameters)) (fn) );
        function = &func;
    };
    virtual ~Method(){};
    const asSFuncPtr* function;
};

struct S
{
    int f()
    {
        return 5;
    }

    int f(int a)
    {
        return a + 1;
    }
};

そして、私のMethodオブジェクトを次のように作成します:

Method<S, int, &S::f> m = Method<S, int, &S::f>();

これは機能します。

ただし、次のようなメソッド オブジェクトを作成しようとすると:

Method<S, int, &S::f, int> m2 = Method<S, int, &S::f, int>();

次のメッセージで壊れます。

template_tests.cpp: In instantiation of ‘Method<C, R, fn, Arguments>::Method() [with C = S; R = int; R (C::* fn)() = &S::f; Arguments = {int}]’:
template_tests.cpp:74:61:   required from here
template_tests.cpp:27:142: error: invalid static_cast from type ‘int (S::*)()’ to type ‘int (S::*)(int)’

パラメーターを持たない関数へのポインターを渡しているので、これは理にかなっています。

Methodでは、さまざまな数のパラメーターを持つクラス メソッドへのメソッド ポインターを受け入れるようにクラスを変更するにはどうすればよいでしょうか。

私はこのようなことをしますか:

template<typename C, typename R, R (C::*fn)(Arguments... parameters), typename... Arguments>
class Method {
...
}   

それを行うと、あらゆる種類のエラーが発生するため..

基本的に、私は尋ねていると思います-テンプレートテンプレート内に可変個引数テンプレートを「埋め込む」にはどうすればよいですか? これは可能ですか?

4

1 に答える 1