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

タプルイテレータそして、タプルのすべてのメンバーを制限された方法で歩く必要があります。 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

Source: https://habr.com/ru/post/J62533/


All Articles