c ++嵌入式模板模板

时间:2013-04-29 02:15:04

标签: c++ templates c++11 variadic-templates angelscript

我有一个'包装'AngelScript方法的类。基本上,您将它发送给Class,方法返回类型,指向方法的指针和参数列表。

到目前为止,当我'绑定'一个不带参数的类方法时,我能够成功地创建这个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 {
...
}   

因为这样做会导致各种错误。

基本上,我想我在问 - 如何在模板模板中嵌入'可变参数模板?这可能吗?

1 个答案:

答案 0 :(得分:2)

从表面上看,似乎你的Method类并不真正需要返回类型和参数类型,它只需要整个函数类型。在这种情况下,Method可以这样定义:

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

如果方法不带参数,则使用如下:

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

或者如果方法采用int参数:

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