2015-04-01 111 views
1

我想做到以下几点:C++ 11可变参数模板参数扩展

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。当函数返回/不接受时,我想让它工作。

的用例将被:

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

您可以'运营商()'模板成员函数及其参数转发到'func_'。 – Lingxi 2015-04-01 14:44:26

+0

@Lingxi有没有办法让它在声明包装器时推导出ArgsType? – iggy 2015-04-01 14:46:27

回答

1

你能确定参数和返回operator()类型(S),并使用完美转发:

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

用g ++ - 4.8 -std = C++ 11和下面的例子:'double myFunc(double a){ return a; } FunctionWrapper(myFunc)wrap;'这给了我错误:参数包没有用'...'扩展' – iggy 2015-04-01 15:14:42

+0

@iggy哎呀,那是一个错字。固定。 – Columbo 2015-04-01 15:15:19

+0

谢谢!但有没有办法说这样的事情: 'auto res = FunctionWrapper(myFunc)(0.0);'没有得到'错误:在'''之前缺少模板参数' – iggy 2015-04-01 15:21:19

0

有做,没有通用的方法,也不是合乎逻辑的。想想Func重载operator()并接受不同的参数类型的情况。但是,您可以规定Func将其参数类型定义为实用程序的成员类型,如FunctionWrapper以进行访问。例如,查看std::function的可能成员类型。