【发布时间】:2017-12-14 05:36:47
【问题描述】:
我正在阅读David Abrahams's C++ Template Metaprogramming,在 ch 5.6 Sequence Equality 中他说:
这很重要,尤其是在处理计算结果时,而不是 落入依赖序列类型标识的陷阱。例如, 您不应该期望以下断言会通过:
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 章对维度分析的探索中看到, 只能用两种相同类型调用的函数模板是 如果这些类型是序列,则可能无法按预期工作。相同 适用于仅匹配的类模板部分专业化 当两个类型参数相同时。
检查的正确方法 序列相等总是使用equal算法,如下:
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 的另一个特化”,那么@987654325 的结果是什么@这里?
Boost manual on pop_back 说返回类型是“Back Extensible Sequence”,mpl::vector 不是一个可向后扩展的序列吗?
【问题讨论】:
标签: c++ boost metaprogramming