1

在查看某些算法的模板名称时,
我发现该名称对应于库概念。

std::mismatch为例。

template< class InputIt1, class InputIt2, class BinaryPredicate >
std::pair<InputIt1,InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
          InputIt2 first2,
          BinaryPredicate p);

它需要一个BinaryPredicatewhich 也是一个库的概念


不过,看看其他算法,我看到:

  • 一元谓词
  • 一元函数
  • 一元操作
  • 二元运算
  • ETC

他们没有对应的概念。

他们被排除在外是有原因的吗?
这些概念是否可以通过结合现有概念而得出?

4

1 回答 1

1

C++ 标准没有定义“概念”。它定义了“要求”,例如:

EqualityComparable, LessThanComparable, DefaultConstructible,
MoveConstructible, CopyConstructible, MoveAssignable, CopyAssignable,
Destructible, NullablePointer, Hash, TrivialClock, Allocator,
Swappable or Container

但有些要求使用与其他要求不同的语法。例如,allocator使用swappable小写斜体 ( allocator ),而我的示例列表中的其他字体则使用驼峰等宽字体,或者如标准中所述,使用类型 ( EqualityComparable) 的常量。

其他“概念”,如PODType,在标准中被视为定义。

例如,BinaryPredicate不是定义为概念,也不是定义;就像使用它的函数的模板名称:

void unique();
template <class BinaryPredicate> void unique(BinaryPredicate pred);

效果:从迭代器引用的每个连续的相等元素组中删除除第一个元素之外的所有元素,i在该范围内[first + 1,last)*i == *(i-1)对于没有参数的版本)或pred(*i, *(i - 1))(对于有谓词参数的版本)适用的范围。仅使迭代器和对已擦除元素的引用无效。

抛出:除非相等比较或谓词抛出异常,否则什么都没有。

复杂性:如果范围[first,last)不为空,则正好(last - first) - 1应用相应的谓词,否则不应用谓词。

如您所见,BinaryPredicate未定义。它只是显示了它如何影响std::unique.

另一方面,cppreference概念列表是从概念提案中提取的,这是非标准的。此外,cppreference并不完美,从概念提案的角度来看,并不是每个 wiki 页面都是完整或完整的描述,还有其他模板参数甚至没有出现在标准中,例如UnaryOperator.

于 2016-10-23T23:08:41.333 回答