c++ - 如何遍历 std::tuple?

标签 c++ c++11 foreach tuples template-meta-programming

<分区>

有比手动编写这样的实用程序更好的解决方案吗?

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) );

最佳答案

尽管 previous, related question 中提供了多个答案(以及您自己提供的那个),我的初步印象是需要迭代元组可能反射(reflect)了糟糕的设计。

如您所知,我们无法遍历 std::tuple 的原因使用标准 C++ 算法是因为 std::tuple不符合 Container concept .而且,准确地说,它不满足这样的概念,因为 std::tuple s 没有 value_type (它们是异质的)。我知道您使用元组是因为您不想创建自己的多态类型并将其存储在标准容器中(例如 std::vector<std::shared_ptr<BaseClass>> )。这给了你一个快速的收获。但这也意味着你主动放弃了Container的优势秒。

它可能有效,但不知何故让人感觉很勉强和不自然:如果你需要容器​​语义,为什么不使用容器呢?如果您需要多态语义,为什么不使用多态类型?

可能我在夸大其词,但这是我的初步印象。

关于c++ - 如何遍历 std::tuple?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155533/

相关文章:

lambda - 为什么 java 8 引入了 iterable.forEach() 循环,即使它有每个循环?

c++ - 用户定义的转换无法指定返回类型

c++ - 使用 for 遍历 QMap

PHP 从多维数组中提取值而无需循环

c# - 通过列表循环 foreach,为不同的值执行代码

c++ - 涉及模板化转换运算符和隐式复制构造函数的歧义

c++ - 从文件中逐字节读取

c++ - 内存使用问题

c++ - 读取数组末尾是否安全?

c++ - 为什么容器移动赋值运算符不是 noexcept?