5

我需要一个支持类型递归的类似 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 不适用于动态生成的递归类型,还是我的语法有问题?

任何建议将不胜感激。

4

1 回答 1

3

mpl::transform在你的情况下不会创建mpl::vector<>'s 但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> )); 

断言不会触发。

于 2010-03-07T18:44:25.363 回答