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