【问题标题】:c++ recursive mpl::equal problem?c++递归mpl::equal问题?
【发布时间】:2010-03-05 16:08:07
【问题描述】:

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

任何建议将不胜感激。

【问题讨论】:

    标签: c++ templates boost boost-mpl


    【解决方案1】:

    mpl::transform 在您的情况下不会创建 mpl::vector&lt;&gt;,而是创建 mpl::vector2&lt;&gt;。这些是不同的类型,即使它们在语义上是等价的。所以如果你写:

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

    断言不会触发。

    【讨论】:

    • 使用即将推出的C++0x,元编程将如何变得更简单...恭喜你发现了它,我想你真的尝试过编译它?
    • 好吧,我之前遇到过这个问题。但无论如何,您始终可以使用 mpl::print 强制编译器生成列出 T 的实际类型的警告。
    • 谢谢!我从来不知道 mpl::print,在文档中没有。这是一个真正的救星。
    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 2020-05-30
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-03-21
    • 2016-02-01
    相关资源
    最近更新 更多