boost mpl计数用于简单示例

时间:2016-11-20 13:13:12

标签: templates boost-mpl

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

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;

1 个答案:

答案 0 :(得分: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;