我正在尝试学习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;
答案 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;