提升 mpl 计数的简单示例

boost mpl count for simple example

我正在尝试学习 boost mpl,尝试了一个非常简单的示例来计算类型在 mpl 映射中出现的次数。有人可以解释为什么这个程序的输出是 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;

根据你要统计的代码中写的类型

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;