1

次を使用して、boost::fusion ベクトルを反復処理しようとしています。

typedef typename fusion::result_of::begin<T>::type t_iter;
  std::cout << distance(begin(t), end(t)) << std::endl;
  for(t_iter it = begin(t); it != end(t); next(it)){
    std::cout<<deref(it)<<std::endl;
  }

distance cout ステートメントによって有限の長さ (2) が得られますが、ループは無限に実行されるようです。

どんなアドバイスも大歓迎です!

4

4 に答える 4

4

そのようなFusionベクトルを反復することはできません。各反復子の型は、前のものとは異なる場合があります (通常は異なります)。it = next(it)それがあなたのコードにない理由だと思います。コンパイルエラーが発生します。

boost::fusion::for_eachこれには、各要素を標準出力に出力する関数オブジェクトと一緒に使用できます。

struct print
{
    template< typename T >
    void operator()( T& v ) const
    {
        std::cout << v;
    }
};

...

boost::fusion::for_each( t, print() );
于 2012-10-26T21:20:00.557 に答える
2

fusionは素晴らしいライブラリであり、日常の C++ プログラムで使用するものとはさまざまな点で大きく異なることがわかります。コンパイル時のメタ プログラミングの力とランタイムを融合させます。fusionコンテナ内のすべてのアイテムを処理できます。これはどういう意味ですか?これは、result_of::begin<T>::type常に一致するとは限らないため、そのようなイテレータをnext(it)使用できないことを意味します。fusionfor

コードの明らかな問題は、 の戻り値を無視するnextと、コードが永久に実行されますがit = next(it)、型が異なる可能性があるため、 で使用できないことです!!

じゃあどうすればいいの??boost::fusion::for_eachその目的のために使用する必要があります

于 2012-10-26T21:25:33.177 に答える
1

next実際にはイテレータを進めません。次のイテレータを返すだけです。

関数は定数引数を取るため、これはドキュメントでnext確認できます。つまり、実際にイテレータを変更できない可能性があります。

template<
    typename I
    >
typename result_of::next<I>::type next(I const& i);
                                         ^^^^^
于 2012-10-26T21:20:38.840 に答える
0

問題は、ループ内でイテレータを逆参照していることです。あなたがそれに適用するときnext、それは何の意味もありません、そしてそれがあなたのループが永遠に実行される理由です。

于 2012-10-26T21:17:40.340 に答える