c ++ рекурсивный mpl :: равная проблема? - PullRequest
5 голосов
/ 05 марта 2010

мне нужна процедура mpl :: equal, которая поддерживает рекурсию типов.

namespace mpl = boost::mpl;

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

вышеизложенное компилируется нормально, однако, если я использую его в mpl :: transform или mpl :: fold, 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 :: equal не работает с динамически сгенерированными рекурсивными типами, или что-то не так с моим синтаксисом?

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

1 Ответ

3 голосов
/ 07 марта 2010

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

Утверждение не сработает.

...