C++ рекурсивный mpl:: равная проблема?

мне нужен 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:: равный не работает над динамично сгенерированными рекурсивными типами или там что-то не так с моим синтаксисом?

любой совет был бы значительно ценивший.

5
задан 16 revs, 4 users 90% 2 December 2011 в 09:06
поделиться

1 ответ

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 не сработает.

3
ответ дан 15 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: