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.
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? –
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
grazie! non ho mai saputo di mpl :: print, non compare da nessuna parte nei documenti. è un vero risparmiatore. –
kyunghoon