例如,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 &)
检查是否符合要求?
答案 0 :(得分:2)
这里隐藏着两个不同的问题。我不知道你打算问哪一个。
首先关于find_if
。明确定义find_if
的方式允许您要拒绝的参数类型,这通常被视为一个特征。因此,以某种方式实施检查将不符合要求,并拒绝有效的代码。
第二个是关于C ++语言。它目前没有提供一种方法来检查甚至更明确地描述模板参数的约束,而不是检查使用情况。这种系统在C ++圈子中使用的名称是 concept 。有些库旨在帮助检查它们(例如在boost中),并且有一个技术规范已在GCC中实现,描述了如何扩展语言以包括语言定义的概念概念,但TS尚未纳入标准。