所以,我最近使用 c++11 的可变参数模板构建了一个委托系统,它就像一个魅力。
然而,在系统中,我为函数构建的参数是在创建时给出的(如我所愿),但现在我也希望能够在调用时传递一些(可变)数量的参数。为了实现这一点,我去重新编写了我的代码,但是我遇到了问题;
error: parameter packs must be at the end of the parameter list
sorry, unimplemented: cannot expand ‘Arguments ...’ into a fixed-length argument list
error: type/value mismatch at argument 1 in template parameter list for ‘template<<declaration error>, class ... Params> class FunctionDelegate’
......还有更多,所以这里有一个引发问题的片段;
template<typename... Params>
class Runnable
{
public:
virtual void invoke(tuple<Params...> params) = 0;
virtual ~Runnable()
{
}
};
这是我的两个委托(FunctionDelegate 和 ObjectDelegate)的父类。这曾经是一个无模板的类(因为 invoke 没有接受任何参数),但是由于我有一个可变参数模板列表,我也必须修改我的子类(显然),我刚刚添加了另一个可变参数给他们的模板;
template<typename... Arguments, typename... Params>
class FunctionDelegate : public Runnable<Params...>
{
public:
typedef void (*FunctionType)(Arguments..., Params...);
FunctionDelegate(FunctionType function, tuple<Arguments...> args)
: function(function), args(args)
{
}
void invoke(tuple<Params...> params)
{
callFunction(typename gens<sizeof...(Arguments)>::type(), params, typename gens<sizeof...(Params)>::type());
}
private:
template<int... S, int... R>
void callFunction(seq<S...>, tuple<Params...> params, seq<R...>)
{
function(get<S>(args)..., get<R>(params)...);
}
private:
FunctionType function;
tuple<Arguments...> args;
};
然而,这似乎是不允许的,至少这是我怀疑的,所以;
- 是否允许有两个可变参数模板列表?
- 有什么方法可以提示编译器,哪个列表?(即在构造函数中使用的那些去 Arguments,其余的去 Params)。
- 如果根本没有办法做到这一点(使用两个可变参数模板列表),是否可以在同一个可变参数列表中使用一个参数和参数,然后使用构造函数的参数简单地将其拆分?
- 还有其他方法可以实现我正在尝试的吗?(除了使用普通的旧的、非类型检查的可变参数传递)。
欢迎任何帮助或见解。