如何遍历std :: tuple?

时间:2013-08-09 20:56:43

标签: 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) );

1 个答案:

答案 0 :(得分:1)

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

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

它可能会起作用,但它在某种程度上感觉强迫和不自然:如果你需要容器​​语义,为什么不使用容器?如果你需要多态语义,为什么不使用多态类型?

可能我夸张了,但这是我最初的印象。