11

我在 Wikipedia ( Existential_types )上查看存在类型的定义,它在某些方面与 C++ 中的概念相似(尤其是概念 lite)。

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

如果不是,两者有什么区别?

4

2 回答 2

4

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


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

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

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

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

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

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

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

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

void print (Container c) {
    for (const auto& e : c)
        print (e);
}

// Later
print (std::vector <int> {1, 2, 3, 4});

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

于 2014-04-09T02:30:57.827 回答
3

据我所知,C++ 概念是任意类型谓词。关于 C++ 概念的工作更多地集中在这些谓词如何集成到语言中,而不是赋予特定含义或指定数学/逻辑模型。这个想法是完全作为一个函数

void f(double x);

显然期待一个类型的参数double,以这样一种简单的方式

template <Container C>
void f(const C& c);

不仅期待 a typename,而且期待 a Container。现在,如何Container定义?它可能是例如

template <typename T>
struct Container: std::false_type { };

template <typename T, size_t N>
struct Container <std::array<T, N> >: std::true_type { };

template <typename T, typename A>
struct Container <std::vector<T, A> >: std::true_type { };

等等。像这样的谓词Container现在已经存在,但是要将它们集成到模板函数中需要不方便的构造,例如std::enable_if. 概念将使这个更清洁和更容易使用。

这又是我的大致理解。

于 2014-04-08T23:49:27.080 回答