C++11 可变模板参数扩展

C++11 variadic template parameter expansion

我想做以下事情:

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

问题是我不知道如何从 Func 类型推导出 ArgsType。我想让它在函数 returns/accepts 什么也没有的情况下工作。

用例将是:

FunctionWrapper<myFunction> wrapper;
auto result = wrapper(1, 2, 3);

没有通用的方法可以做到这一点,也不符合逻辑。想想 Func 重载 operator() 并接受不同参数类型的情况。但是,您可以强制要求 Func 将其参数类型定义为成员类型,供 FunctionWrapper 等实用程序访问。有关示例,请参阅 std::function 的可能成员类型。

您可以确定 operator() 中的参数和 return 类型并使用完美转发:

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