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)...);
}
};
我想做以下事情:
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)...);
}
};