C++11 C++;11可变模板参数展开
我想做以下工作:C++11 C++;11可变模板参数展开,c++11,metaprogramming,variadic-templates,C++11,Metaprogramming,Variadic Templates,我想做以下工作: template<typename Func> class FunctionWrapper { public: typedef decltype(Func()) ReturnType; typedef ... ArgsType; FunctionWrapper(Func func) { func_ = func; } ReturnType operator() (ArgsType args)
template<typename Func>
class FunctionWrapper
{
public:
typedef decltype(Func()) ReturnType;
typedef ... ArgsType;
FunctionWrapper(Func func)
{
func_ = func;
}
ReturnType operator() (ArgsType args)
{
return func_(args);
}
private:
Func func_;
};
模板
类函数包装器
{
公众:
typedef decltype(Func())ReturnType;
typedef…ArgsType;
函数包装器(Func Func)
{
func=func;
}
ReturnType运算符()(ArgsType args)
{
返回函数(参数);
}
私人:
Func Func_;
};
问题是我不知道如何从Func类型推断ArgsType。我想让它在函数不返回/不接受任何内容时工作
然后,用例将是:
FunctionWrapper<myFunction> wrapper;
auto result = wrapper(1, 2, 3);
FunctionWrapper;
自动结果=包装器(1,2,3);
没有通用的方法,也不符合逻辑。试想一下当Func
重载operator()
并接受不同的参数类型时的情况。但是,您可以要求Func
将其参数类型定义为FunctionWrapper
等实用工具要访问的成员类型。有关示例,请参阅的可能成员类型。您可以在operator()
中确定参数和返回类型,并使用完美转发:
template <typename Func>
class FunctionWrapper
{
Func func_;
public:
FunctionWrapper(Func func) : func_(func) {}
template <typename... Args>
auto operator() (Args&&... args)
-> decltype(func_(std::forward<Args>(args)...)) {
return func_(std::forward<Args>(args)...);
}
};
模板
类函数包装器
{
Func Func_;
公众:
FunctionWrapper(Func Func):Func_(Func){
模板
自动运算符()(Args&&…Args)
->decltype(func(std::forward(args)…){
返回函数(std::forward(args)…);
}
};
您可以创建operator()
一个模板成员函数,并将其参数转发给func\u
@Lingxi是否有办法在声明包装时推导ArgsType?使用g++-4.8-std=c++11和以下示例:double myFunc(double a){return a;}FunctionWrapper(myFunc)wrap;
这给了我错误:参数包没有扩展为“…”
@iggy哇哦,这是一个打字错误。修复了。谢谢!但是有没有一种方法可以这样说:自动res=FunctionWrapper(myFunc)(0.0);
而没有得到错误:以前缺少模板参数'('token
?您可以使用工厂函数创建像std::make_pair
@iggy这样的帮助函数。即模板函数包装器makeWrapper(F F){return{F};}