2016-11-20 41 views
2

我想学习boost mpl,试过一个非常简单的例子来计算一个类型出现在mpl map中的次数。可能有人解释为什么这个程序的输出为0boost mpl count为简单例子

typedef map< 
      pair<int, unsigned> 
      , pair<char, unsigned char> 
      , pair<long_<5>, char[17]> 
      , pair<int[42], bool> 
      > m; 


    std::cout << mpl::count < 
          m, 
          mpl::key_type 
            < 
            m, 
            pair<int, unsigned> 
            >::type 
          >::type::value << std::endl; 

回答

2

根据什么写的代码,你想在你的地图计数型

key_type< 
    m, 
    pair<int, unsigned> 
>::type 

的发生。这到底是一个int,因为在MPL的描述:: key_type的,你会发现:

key_type<m,x>::type   Identical to x::first; 

好了,让我们看看你有什么地图的实际内容。 我只能写出地图的类型,但我想告诉你如何检查类型的快速和懒惰的方式。 :P

所以,我们只是让编译器无法看到地图的类型是什么。 我的地方加入这一行做到了:

typename m::blaa BB; 

当然,编译失败(因为blaa不是mpl::map类型的元素)具有以下错误消息:

error: 'blaa' in 'm {aka struct boost::mpl::map<boost::mpl::pair<int, unsigned int>, boost::mpl::pair<char, unsigned char>, boost::mpl::pair<mpl_::long_<5l>, char [17]>, boost::mpl::pair<int [42], bool> >}' does not name a type 

好吧,我们可以阅读的是,该地图包含对的列表(例如,boost::mpl::pair<int, unsigned int>), 但是没有int。在您拨打mpl::count时,您正在寻找int

只要尝试用 替换您的std::cout行,您会看到结果如预期。

std::cout << 
    boost::mpl::count< m, 
     boost::mpl::pair<int, unsigned> 
    >::type::value 
<< std::endl;