2010-03-05 17 views
5

necesito un procedimiento mpl :: igual que admite recursividad en tipos.C++ murs recursivo :: ¿problema igual?

namespace mpl = boost::mpl; 

BOOST_MPL_ASSERT((mpl::equal< 
mpl::vector<int, char>, 
typename mpl::push_back<mpl::vector<int>, char>::type >)); // OK 

lo anterior compila bien, sin embargo, si lo uso en MPL :: transformar o MPL :: veces, Visual Studio 2010 RC1 se queja.

typedef mpl::vector< 
mpl::vector<int, char>, 
mpl::vector<char, char>> type_1; 
typedef mpl::transform< 
mpl::vector< 
    mpl::vector<int>, 
    mpl::vector<char>>, 
mpl::push_back<mpl::_, char>>::type type_2; 
BOOST_MPL_ASSERT((mpl::equal<type_1, type_2>)); // FAILS 

Sin embargo, estos trabajos ...

BOOST_MPL_ASSERT((mpl::equal< 
    typename mpl::at_c<type_1, 0>::type, 
    typename mpl::at_c<type_2, 0>::type>)); // OK 
BOOST_MPL_ASSERT((mpl::equal< 
    typename mpl::at_c<type_1, 1>::type, 
    typename mpl::at_c<type_2, 1>::type>)); // OK 

no es lo que MPL :: igual no funciona en tipos recursivos generadas dinámicamente, o es algo malo en mi sintaxis?

cualquier consejo sería muy apreciado.

Respuesta

3

mpl::transform no crea mpl::vector<> 's en su caso pero mpl::vector2<>' s. Estos son tipos diferentes, incluso si son semánticamente equivalentes. Por lo tanto, si escribe:

typedef mpl::vector2< 
    mpl::vector2<int, char>, mpl::vector2<char, char> 
> type_1; 

typedef mpl::transform< 
    mpl::vector<mpl::vector<int>, mpl::vector<char> > 
    , mpl::push_back<mpl::_, char> 
>::type type_2; 

BOOST_MPL_ASSERT((mpl::equal<type_1, type_2>)); 

la afirmación no se activará.

+0

¿Cómo va a ser más fácil para la metaprogramación con el próximo 'C++ 0x' ... congratz para averiguarlo, supongo que realmente trataste de compilarlo? –

+2

Bueno, me encontré con este problema antes. Pero independientemente, siempre puede usar mpl :: print para forzar al compilador a generar una advertencia que enumera el tipo real de T. – hkaiser

+0

¡gracias! nunca supe sobre mpl :: print , no está en ninguna parte en los documentos. es un verdadero salvavidas. – kyunghoon