如何遍历 std::tuple
How to iterate through std::tuple?
还有比手动编写这样的实用程序更好的解决方案吗?
template < size_t > struct SizeT { };
template < typename TupleType, typename ActionType >
inline void TupleForEach( TupleType& tuple, ActionType action )
{
TupleForEach( tuple, action, SizeT<std::tuple_size<TupleType>::value>() );
}
template < typename TupleType, typename ActionType >
inline void TupleForEach( TupleType& tuple, ActionType action, SizeT<0> ) { }
template < typename TupleType, typename ActionType, size_t N >
inline void TupleForEach( TupleType& tuple, ActionType action, SizeT<N> )
{
TupleForEach( tuple, action, SizeT<N-1>() );
action( std::get<N-1>( tuple ) );
}
像这样使用:
std::tuple<char, int, double> tt;
TupleForEach( tt, (boost::lambda::_1 = 5) );
尽管在
前面的相关问题(以及您自己提供的问题(中提供了几个答案,但我的初步印象是,迭代元组的需要可能反映了糟糕的设计。
如您所知,我们之所以无法使用标准C++算法迭代std::tuple
,是因为std::tuple
不符合Container
概念。而且,准确地说,它没有满足这样的概念,因为std::tuple
没有value_type
(它们是异构的(。我知道您使用元组是因为您不想创建自己的多态类型并将其存储在标准容器中(例如,std::vector<std::shared_ptr<BaseClass>>
(。这给了你一个快速的收益。但这也意味着你自愿放弃了Container
的优势。
它可能有效,但不知何故感觉是被迫和不自然的:如果你需要容器语义,为什么不使用容器呢?如果需要多态语义,为什么不使用多态类型?
可能我夸大其词,但这是我的第一印象。
相关文章:
- 在 std::tuple 上使用 std::variant 的问题
- 在构造函数中使用可变参数初始化 std::tuple
- 转发复制的 std::tuple
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- std::tuple 可以根据其值在编译时/运行时排序吗?
- 返回 std::tuple 中的引用和值
- 带有引用的std::tuple在clang中编译失败,但在gcc中编译失败
- 尝试实现std::tie和std::tuple的小版本
- std::tuple默认构造函数,带有move可构造元素
- 来自带有 std::tuple 的地图
- 如何从 std::async 任务返回 std::tuple
- 为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?
- 为什么 std::integral_constant 在爆炸 std::tuple 时是必需的?
- 如何在std :: tuple中的每个元素上应用constexpr函数
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- 类型安全 - all_of/ any_of/ none_of for std::tuple
- 将__m128i值转换为 std::tuple
- 使结构的行为类似于 std::tuple
- std::tuple faster than std::array?
- C++ 在标准::unordered_map中设置 std::tuple 值