【问题标题】:sequence equality in boost mpl pop_backboost mpl pop_back中的序列相等
【发布时间】: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


    【解决方案1】:

    它将是某种构造的序列类型,您可以查看pop_back_impl for vector in

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多