如何在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)...);
}
这里是一个问题:我想为包装函数创建一个模板类,并为参数存储使用元组,但它似乎不能很好地工作,我无法找到原因。 所以我需要一些帮助,谁可以解释它。 thx为您的帮助!如何在C++ 11中解封装函数参数的元组?
下面的代码:
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
的一系列数字,而不是来自makeSeq
本身的序列的长度。
你也应该注意到,Args
在FuncWrapper
就可以了(可能是CV-合格)左值引用类型的,这样的论据安全地存储在一个元组,元组的声明应该如下:
std::tuple<typename std::decay<Args>::type...> para;
// ~~~~~~~~~^
另一个问题是函数的预期行为是什么,比如'void foo(std :: unique_ptr
@ Jarod42谢谢你提醒,我只是在做一个练习,而没有深入考虑它。 – user5570258
是否有理由不能使用C++ 14的['index_sequence'](http://en.cppreference.com/w/cpp/utility/integer_sequence)而不是您自己的'IndexSeq'? –
@JonathanWakely:可能是因为它被标记为C++ 11(并在标题中重复)。 – Jarod42
@ Jarod42,但仍然可以在C++ 11中使用'integer_sequence',例如[integer_seq.h](https://gitlab.com/redistd/integer_seq/blob/master/integer_seq.h)。这将是“前向兼容”,而不是重新发明轮子,用不同的拼写。 –