C++概念是存在类型的一种形式吗?

Rex*_*xar 11 c++ existential-type c++-concepts

我在维基百科(Existential_types)上看到存在类型的定义,它在某种程度上与C++中的概念(特别是概念精简版)相似.

C++概念是存在类型的一种形式吗?

如果没有,两者之间有什么区别?

Stu*_*sen 4

TL;DR:是的,概念是(或者至少允许你定义)存在类型。

\n\n
\n\n

这是我的推理,但请注意;我不是类型理论家:

\n\n

考虑维基百科对抽象数据类型的定义(强调我的):

\n\n
\n

在计算机科学中,抽象数据类型(ADT)是一种或多种具有相似语义的编程语言的某一类数据类型的数学模型。抽象数据类型是间接定义的,仅由可以对其执行的操作以及对这些操作的影响(以及可能的成本)的数学约束来定义

\n
\n\n

正如这 两个Stack Overflow 问题和您链接的维基百科文章所描述的,存在类型似乎是一种使用参数化定义对抽象数据类型进行建模的方法。重要的是,这些参数不是结果存在类型的一部分。

\n\n

另一方面,从表面上看,概念是一个(零?)或多个类型的谓词,可用于限制模板。在考虑子句之前,它们与存在类型 xe2x80x94 之间的关系并不明显requires

\n\n

基本上,requires允许您测试类型的某些属性。其中包括它们是否定义了某种成员类型、是否具有某种成员函数、是否可转换为某种类型等。这种观察(实际上是设计的要点)是问题的关键所在。

\n\n

至少在我看来,概念本质上是一种定义抽象数据类型的机制。从这里我们开始看到与存在类型的相似之处:它们通过参数化来建模 ADT,更重要的是,允许您在不暴露参数的情况下定义 ADT 。

\n\n

Container概念为例。您可以使用 Concepts Lite 编写类似的内容

\n\n
void print (Container c) {\n    for (const auto& e : c)\n        print (e);\n}\n\n// Later\nprint (std::vector <int> {1, 2, 3, 4});\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是有效的,因为存在某种类型I,例如表达式begin (c)end (c)返回类型的对象 I,以及Container\ 的其他约束。这就是存在量化;Container是一种存在主义类型。

\n