仅当函数是函数模板时才能使用参数包。
From http://en.cppreference.com/w/cpp/language/parameter_pack http://en.cppreference.com/w/cpp/language/parameter_pack:
模板参数包是接受零个或多个模板实参(非类型、类型或模板)的模板参数。函数参数包是接受零个或多个函数参数的函数参数。
具有至少一个参数包的模板称为可变参数模板。
template <typename ... Args>
T operator()(Functor&& f, Args... args)
{
return f(args...);
}
另外,使用&&
上面的函数中只有当它是模板参数时才有意义。当你使用&&
对于类型不是模板参数的参数,您不能使用:
A<int> a;
B<A<int>> b;
int r = b(a, 2, 3);
但是,您可以使用
int r = b(std::move(a), 2, 3);
做出你的选择。保持参数类型不变并使用std::move(a)
或更改函数以使用简单的引用
template <typename ... Args>
T operator()(Functor& f, Args... args)
{
return f(args...);
}
and use
int r = b(a, 2, 3);
Update
您可以使用辅助类来确保所有参数的类型正确。
template<typename ... Args> struct IsSame : public std::false_type {};
template<typename T> struct IsSame<T> : public std::true_type {};
template<typename T, typename ... Args> struct IsSame<T, T, Args...> : public std::true_type
{
static const bool value = IsSame<T, Args ...>::value;
};
and use:
template <typename ... Args>
T operator()(Functor&& f, Args... args)
{
static_assert(IsSame<T, Args...>::value, "Invalid argument type");
return f(args...);
}
接着就,随即,
A<int> a;
B<A<int>> b;
int r = b(std::move(a), 2, 3);
仍然有效但是
r = b(std::move(a), 2, 3.0);
fails.
我不知道您的情况是否需要对参数类型如此严格。如果你需要的话,你有办法。