IS C STL模板参数足够精确

Is c++ STL template parameter precise enough?

本文关键字:参数 STL IS      更新时间:2023-10-16

例如,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 &)检查它是否已稳定?

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

第一个关于find_if。明确定义find_if的方式允许您要拒绝的参数类型,并且通常被视为功能。因此,以一种或另一种方式实施检查将不一致,并且会拒绝有效的代码。

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