如何遍历 std::tuple

How to iterate through std::tuple?

本文关键字:std tuple 遍历 何遍历      更新时间:2023-10-16

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

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的优势。

它可能有效,但不知何故感觉是被迫和不自然的:如果你需要容器语义,为什么不使用容器呢?如果需要多态语义,为什么不使用多态类型?

可能我夸大其词,但这是我的第一印象。