2010-03-05 7 views
5

ho bisogno di una procedura mpl :: uguale a quella che supporta la ricorsione sui tipi.C++ mpl ricorsivo: uguale problema?

namespace mpl = boost::mpl; 

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

quanto sopra compila bene, se lo uso in MPL :: trasformare o mpl :: piega, Visual Studio 2010 RC1 lamenta.

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 

tuttavia, questi lavori ...

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 

è che MPL :: uguale non funziona su tipi ricorsivi generate dinamicamente, o c'è qualcosa di sbagliato con la mia sintassi?

qualsiasi consiglio sarebbe molto apprezzato.

risposta

3

mpl::transform non crea mpl::vector<> nel tuo caso ma mpl::vector2<> s. Questi sono diversi tipi, anche se sono semanticamente equivalenti. Quindi se scrivi:

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

l'assert non sparerà.

+0

Come le cose diventeranno più semplici per metaprogrammazione con l'imminente 'C++ 0x' ... congratz per averlo scoperto, suppongo che tu abbia effettivamente provato a compilarlo? –

+2

Bene, mi sono imbattuto in questo problema prima. Ma a prescindere, puoi sempre usare mpl :: print per forzare il compilatore a generare un avviso che elenca il tipo effettivo di T. – hkaiser

+0

grazie! non ho mai saputo di mpl :: print , non compare da nessuna parte nei documenti. è un vero risparmiatore. – kyunghoon