7

このようなユーティリティを手動で書くよりも良い解決策はありますか?

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

1 に答える 1

1

以前の関連する質問(およびあなた自身が提供した質問)でいくつかの回答が提供されていますが、私の最初の印象は、タプルを反復処理する必要があるのは設計の悪さを反映している可能性があるということです。

ご存知のように、std::tuple標準の C++ アルゴリズムを使用して反復できない理由は、概念std::tupleを満たしていないためです。そして、正確には、s は a を持たない(異種である) ため、そのような概念を満たしません。タプルを使用したのは、独自のポリモーフィック型を作成して標準のコンテナー (例: ) に格納したくなかったためです。これにより、迅速な利益が得られました。しかし、それはまた、s の利点を自発的に放棄したことを意味します。Containerstd::tuplevalue_typestd::vector<std::shared_ptr<BaseClass>>Container

それは機能するかもしれませんが、どこか強制的で不自然に感じます: コンテナのセマンティクスが必要な場合は、コンテナを使用してみませんか? ポリモーフィック セマンティクスが必要な場合は、ポリモーフィック型を使用してみませんか?

大げさかもしれませんが、これが私の第一印象です。

于 2013-08-09T22:25:41.353 に答える