c ++ STL模板参数是否足够精确?

时间:2017-06-24 13:22:11

标签: c++ c++11 templates stl

例如,c ++ std :: find_if的实现方式如下:

template <class InputIter, class UnaryPredicate>
InputIter find_if(InputIter begin, InputIter end, UnaryPredicate pred) {
    for (; begin != end; begin++) {
        if (pred(*begin))
            return begin;
    }
    return end;
}
  • InputIter应为std::input_iterator_tag类型,但在此函数中,可以编译任何具有operator++ operator++(int)的类型。
  • UnaryPredicate应该类似bool function(const T &value),但任何函数返回int double都可以编译。

STL模板参数是否足够精确?在编译时似乎没有检查所有可能的错误。

我们可以像:

那样实现它
template <T, Iter<? super std::input_iterator<T>>, Pred<? implement bool (const T&)>>
Iter find_if(Iter begin, Iter end, Pred p) {
  for (; begin != end; begin++) {
    if (p(*begin))
      return begin;
  }
  return end;
}

在这个假代码中,我希望find_if适用于T类型,它的范围为[begin, end),并使用bool (const T &)检查是否符合要求?

1 个答案:

答案 0 :(得分:2)

这里隐藏着两个不同的问题。我不知道你打算问哪一个。

首先关于find_if。明确定义find_if的方式允许您要拒绝的参数类型,这通常被视为一个特征。因此,以某种方式实施检查将不符合要求,并拒绝有效的代码。

第二个是关于C ++语言。它目前没有提供一种方法来检查甚至更明确地描述模板参数的约束,而不是检查使用情况。这种系统在C ++圈子中使用的名称是 concept 。有些库旨在帮助检查它们(例如在boost中),并且有一个技术规范已在GCC中实现,描述了如何扩展语言以包括语言定义的概念概念,但TS尚未纳入标准。

相关问题