мне нужен mpl:: равняйтесь как процедура, которая поддерживает рекурсию на типах.
namespace mpl = boost::mpl;
BOOST_MPL_ASSERT(( mpl::equal<
mpl::vector<int, char>,
typename mpl::push_back<mpl::vector<int>, char>::type > )); // OK
вышеупомянутые прекрасные компиляции, однако если я использую его в mpl:: преобразуйте или mpl:: сгиб, visual studio 2010 rc1 жалуется.
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
однако, они работают...
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
это что mpl:: равный не работает над динамично сгенерированными рекурсивными типами или там что-то не так с моим синтаксисом?
любой совет был бы значительно ценивший.
mpl::transform
создает не mpl::vector<>
в вашем случае, а mpl::vector2<>
. Это разные типы, даже если семантически они эквивалентны. Поэтому если вы напишете:
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> ));
assert не сработает.