我正在阅读David Abrahams's C++ Template Metaprogramming,他说:5.6序列平等他说:
重要的是,特别是在处理计算结果时,不要这样做 陷入依赖序列类型身份的陷阱。例如, 你不应该期望以下断言通过:
BOOST_STATIC_ASSERT(( // error boost::is_same< mpl::pop_back<mpl::vector<int, short> >::type , mpl::vector<int> >::value ));
对于大多数用途,上面比较的两种类型的行为是相同的,大多数时候你永远不会注意到差异。那 说,使用mpl :: pop_back进行专业化的结果 mpl :: vector不会是mpl :: vector的另一个特化!
和你一样 我们在第3章中探讨了尺寸分析,a 只能用两种相同类型调用的函数模板是 如果这些类型是序列,可能不会按预期工作。相同 用于仅匹配的类模板部分特化 当两个类型参数相同时。
检查的正确方法 序列相等总是使用相等的算法,如下所示:
BOOST_STATIC_ASSERT(( // OK mpl::equal< mpl::pop_back<mpl::vector<int, short> >::type , mpl::vector<int> >::value ));
我在这里不明白:“那就是说,在mpl :: vector的特化上使用mpl :: pop_back的结果不会是mpl :: vector的另一个特化”,那么{{的结果是什么? 1}}这里?
Boost manual on pop_back表示返回类型是“后可扩展序列”,不是mpl::popback
后向可扩展序列吗?
答案 0 :(得分:0)
它将是某种构造的序列类型,你可以在
中查看vector的pop_back_impl