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};}