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