タプルイテレータ(ブースト)

タプルイテレータそして、タプルのすべてのメンバーを制限された方法で歩く必要があります。 std :: vector <boost :: tuple <... >>のような構造のファイルをXMLで保存するためにこれが必要でした。 ところで、私はこれをQtで書きます。



まあ、大丈夫、ポイントまで。



boost :: fusionライブラリを採用しています。 原則として、イテレーターはタプルの最初の要素へのポインターです。



たとえば、ここに私たちの車列があります。



typedef boost::tuple<int , char* , float> tup; //



tup my_tup(12, "two" , 3.4); //



boost::fusion::result_of::begin::type it(my_tup); //



std::cout << *it << '\n'; // 12











イテレータをインクリメントすることはより困難ですが、解決可能です。



std::cout << *boost::fusion::next( it ) << '\n'; // "two"











役立つようにテンプレートの再帰が呼び出されました。



次のようなものが欲しい:



template void work(R& item)

{

//

std::cout << *item << '\n';

//

work( boost::fusion::next(item));

}













しかし、問題は停止していました。停止する必要があるものをどのように理解するのですか? 原則として、イテレータが次の構造と等しくなったら、すべてを停止する必要があります。



boost::fusion::result_of::end::type end; //











boost :: type_traitsおよびboost :: mpl :: if_と呼びます。



イテレータが他に行く場所がないことを認識すると、再帰が短くなり、別のパスに進むようにする必要があります。 別の方法として、私たちは彼女のメソッドを滑らせます-ダミー、つまり反復子が最後に達したとき、彼はワーカーの代わりにこのメソッドを呼び出さなければなりません。 これを行うには、両方のメソッドを構造に固定し、静的メソッドとして配置します。 その場合、これらのメソッドの呼び出しは類似しており、構造タイプのみが異なります。 そして、再帰を停止するために、最後の瞬間に構造のタイプを置き換える必要があります。 構造のタイプを変更するには、boost :: type_traitsからboost :: is_sameの構成をポップする条件として、boost :: mpl :: if_を使用します。 この条件は、現在のイテレータと最後のイテレータを毎回チェックします。 行こう:



struct do_work

{

template<typename T,typename R >

static void work(R& item ) //

{

#pragma message("******** process tuple **************") // compile-time



// procees item

std::cout << *item << '\n';

//



typedef typename boost::fusion::result_of::end::type end; //

typedef typename boost::fusion::result_of::next::type next; //

typename next nex = boost::fusion::next( item ) ;

boost::mpl::if_<

boost::is_same<next , end>::type , // -

end_work , //

do_work //

>::type::work( nex );

}



};



struct end_work //

{

template <typename T,typename R>

static void work(R& /*tip*/) //

{

#pragma message("******** end of tuple *************")

}

};



, .



int main()

{



typedef boost::tuple<int , char* , float> tup; //

tup my_tup(12, "two" , 3.4); //



do_work::work( boost::fusion::begin(my_tup) ); //



std::cin.ignore();

return 0;



}







, , .











********プロセスタプル***************

********プロセスタプル***************

********プロセスタプル***************

********タプルの終わり*************







それだけです

脅威著者は独創的で専門的なふりをせず、コードは読み書きができず、まったく何もありません。3日前にそのような記事を読んでいたとしても、その日は命を救ったでしょう。

haccel.pp.ru



All Articles