【问题标题】:Are C++ concepts a form of existential type?C++ 概念是存在类型的一种形式吗?
【发布时间】:2014-08-22 17:44:24
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ existential-type c++-concepts


【解决方案1】:

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


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

考虑Wikipedia's definition of abstract data type(强调我的):

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

thesetwo 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 是存在类型。

【讨论】:

  • 所以任何满足协议的泛型都是存在的? fn print&lt;T : Printable&gt;(T t)T 是存在的
【解决方案2】:

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

void f(double x);

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

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

不仅期待typename,而且期待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 这样的不方便的构造。概念将使这个更清洁、更易于使用。

这也是我的大致理解。

【讨论】:

  • Concepts lite 是任意类型的谓词。最初的概念设计要强大得多。
  • 当你可以使用static_assert时,你不需要enable_if
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
相关资源
最近更新 更多