c++ boost iterator boost-fusion

c++ - Iterando sobre la fusión de Boost:: vector



iterator boost-fusion (4)

El problema es que dentro del ciclo está desreferenciando su iterador. Cuando se postula a next , no significa nada y es por eso que su ciclo se ejecuta para siempre.

Estoy tratando de iterar sobre un vector boost :: fusion usando:

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; }

La instrucción cout de distancia me da una longitud finita (2), sin embargo, el ciclo parece ejecutarse indefinidamente.

¡Algún consejo muy apreciado!


fusion es una biblioteca maravillosa, y ahora debería ser muy diferente de lo que usa en los programas cotidianos C ++ de múltiples maneras, combina la potencia de la programación meta en tiempo de compilación con el tiempo de ejecución, para eso debería ahora que no hay ningún tipo que puede manejar todos los elementos en un contenedor de fusion . ¿Lo que esto significa? significa que result_of::begin<T>::type no siempre es una coincidencia de next(it) por lo que no puede usar iteradores de fusion en a for así.

El problema obvio en su código es que ignora el valor de retorno de next y hará que su código se ejecute para siempre, pero no puede usarlo en it = next(it) , ¡ya que su tipo puede variar!

Entonces, ¿qué deberías hacer? Deberías usar boost::fusion::for_each para ese propósito


next no avanza realmente en el iterador, simplemente devuelve el siguiente.

Esto se puede ver en los documentos, ya que la función next toma un argumento constante, lo que significa que no puede modificar el iterador:

template< typename I > typename result_of::next<I>::type next(I const& i); ^^^^^


No puede simplemente iterar un vector Fusion como ese, el tipo para cada iterador puede ser diferente al anterior (y normalmente lo es). Supongo que es por eso que no lo tienes it = next(it) en tu código, daría un error de compilación.

Puede usar boost::fusion::for_each para esto, junto con un objeto de función que imprime cada elemento en el resultado estándar:

struct print { template< typename T > void operator()( T& v ) const { std::cout << v; } }; ... boost::fusion::for_each( t, print() );