[英]how unpack tuple for wrapper function parameter in c++11?
//function wapper
template<class F,typename...Args>
class FuncWrapper
{
private:
//F return type
using return_type = typename std::result_of<F(Args...)>::type;
template<int ...S> struct IndexSeq {};
template<int N, int ...S> struct makeSeq : makeSeq<N - 1, N - 1, S...> {};
template<int ...S> struct makeSeq<0, S...> : IndexSeq<S...> {};
public:
FuncWrapper(F &&func,Args&&...args):
f(std::move(std::function<return_type(Args...)>(std::forward<F>(func)))),
para(std::make_tuple<Args...>(std::forward<Args>(args)...))
{}
~FuncWrapper() = default;
template <int... INDEX>
return_type delay_action(makeSeq<INDEX...>)
{
return f(std::get<INDEX>(para)...);
}
//
return_type operator()()
{
return delay_action(makeSeq<sizeof...(Args)>{});
}
private:
//function
std::function<return_type(Args...)> f;
//parameter in the tuple
std::tuple<Args...> para;
};
template<class F,typename ...Args>
FuncWrapper<F,Args...> make_function_wapper(F &&f, Args&&...args)
{
return FuncWrapper<F, Args...>(std::forward<F>(f), std::forward<Args>(args)...);
}
这是一个问题:我想为包装器函数创建一个模板类,并为参数存储使用元组,但是似乎它不能很好地工作,我也找不到原因。 所以我需要一些帮助,谁能解释。 谢谢您的帮助!
下面的代码:
template <int... INDEX>
return_type delay_action(makeSeq<INDEX...>)
{
return f(std::get<INDEX>(para)...);
}
应该:
template <int... INDEX>
return_type delay_action(IndexSeq<INDEX...>)
// ~~~~~~~^
{
return f(std::get<INDEX>(para)...);
}
您使用的序列生成器背后的想法是,最派生的makeSeq<2>
类最终继承自IndexSeq<0, 1>
,您要推论的是IndexSeq
的一系列数字,而不是a的长度。 makeSeq
本身的序列。
您还应该注意, FuncWrapper
中的Args
可以是(可能是cv限定的)左值引用类型,因此为了安全地将参数存储在元组中,元组声明应如下所示:
std::tuple<typename std::decay<Args>::type...> para;
// ~~~~~~~~~^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.