如何遍历TR1元组
How to iterate over a TR1 tuple
被困在TR1陆地上,对于一个测试程序,我需要对一些特定类型的对象执行某些操作。我有两个元组类型定义,看起来像这样:
typedef std::tr1::tuple< bool
, signed char
, signed short
, signed int
, signed long long
, unsigned char
, unsigned short
, unsigned int
, unsigned long long > integral_types;
从每个元组类型创建一个对象。然后我有类似于这样的函数模板:
template<typename T>
void invoke_operation_1(T& obj);
需要对元组对象中的所有对象调用。
我如何在c++ 03中做到这一点?
刚刚在Bristol为c++ 14完成了一个特性来解决这个问题。这并不难处理。
对于更简单的情况,可以使用递归模板。虽然没有部分函数专门化之类的,但还是有点乱。
template<typename Tup, std::size_t N> struct visit_detail {
template<typename F> static void call(Tup& t, F f) {
f(std::tr1::get<N>(t));
return visit_detail<Tup, N+1>::call(t, f);
}
};
template<typename Tup> struct visit_detail<Tup, std::tr1::tuple_size<Tup>::value> {
template<typename F> static void call(Tup& t, F f) {}
}
template<typename Tup, typename F> void visit(Tup& t, F f) {
return visit_detail<Tup, 0>::call(t, f);
}
这里的f可以是硬编码的,也可以是参数函数对象,或者任何你想要的。
如果需要为元组中的每个对象调用相同的模板函数,可以使用boost::fusion。例如
template<typename T>
void invoke_operation_1(T& obj)
{
std::cout << obj << std::endl;
}
struct executor
{
template<typename T>
void operator()(T& t) const
{
invoke_operation_1(t);
}
};
typedef boost::tuple< bool
, signed char
, signed short
, signed int
, signed long long
, unsigned char
, unsigned short
, unsigned int
, unsigned long long > integral_types;
int main()
{
integral_types t(true, 0, 1, 2, 3, 4, 5, 6, 7);
boost::fusion::for_each(t, executor());
return 0;
}
template<typename tup, typename N>
struct visit_detailImpl {
template<typename f>
static void call(tup& t, f f) {
f(std::tr1::get<N::value>(t));
return visit_detailImpl<tup, std::integral_constant<std::size_t, N::value + 1> >::call(t, f);
}
};
template<typename tup> // end recursion struct
struct visit_detailImpl<tup, std::integral_constant<std::size_t, std::tr1::tuple_size<tup>::value> > {
template<typename f>
static void call(tup& t, f f) {}
};
template<typename tup, typename Fn>
void for_each_tup(tup& t, Fn f) {
return visit_detailImpl<tup, std::integral_constant<std::size_t, 0> >::call(t, f);
}
相关文章:
- C++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 将元组的向量转换/构造为堆
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 将元组的向量构造成堆
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 将元组类型扩展为可变参数模板?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 类内部和外部静态 constexpr 元组之间的差异
- 可变参数模板与使用元组在参数中添加不同的数据对
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- boost::包含提升单元的元组的哈希值
- 我正在寻找一种优雅的方式来从元组向量创建tuple_element向量
- c value_type对于std :: tr1不起作用:std :: map中的元组
- 在tr1::hash中使用boost::元组
- 如何遍历TR1元组