是C++;概念是存在类型的一种形式吗? 我在维基百科()上看到了存在类型的定义,它在某些方面与C++(特别是to)中的概念感觉相似。 < C++概念是存在型的一种形式吗?< /P> 如果不是,那么两者之间有什么区别? < P>。据我所知,C++概念是任意类型谓词。C++概念的研究更多地集中于这些谓词如何融入语言,而不是给出特定的意义或指定数学/逻辑模型。我们的想法是,这正是一个函数 void f(double x);

是C++;概念是存在类型的一种形式吗? 我在维基百科()上看到了存在类型的定义,它在某些方面与C++(特别是to)中的概念感觉相似。 < C++概念是存在型的一种形式吗?< /P> 如果不是,那么两者之间有什么区别? < P>。据我所知,C++概念是任意类型谓词。C++概念的研究更多地集中于这些谓词如何融入语言,而不是给出特定的意义或指定数学/逻辑模型。我们的想法是,这正是一个函数 void f(double x);,c++,existential-type,c++-concepts,C++,Existential Type,C++ Concepts,显然需要一个类型为double的参数,方法非常简单 template <Container C> void f(const C& c); 等等。像Container这样的谓词现在已经存在,但是要将它们集成到模板函数中,需要像std::enable\u if这样不方便的构造。概念将使其更干净、更易于使用 这也是我大致的理解;DR:是的,概念是(或至少允许您定义)存在类型 这是我的理由,尽管要提醒你;我不是类型理论家: 考虑(我的重点): 在计算机科学中,抽象数据类型(ADT

显然需要一个类型为
double
的参数,方法非常简单

template <Container C>
void f(const C& c);
等等。像
Container
这样的谓词现在已经存在,但是要将它们集成到模板函数中,需要像
std::enable\u if
这样不方便的构造。概念将使其更干净、更易于使用


这也是我大致的理解;DR:是的,概念是(或至少允许您定义)存在类型


这是我的理由,尽管要提醒你;我不是类型理论家:

考虑(我的重点):

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

存在类型,如堆栈溢出问题和您链接的Wikipedia文章所述,似乎是一种使用参数化定义建模抽象数据类型的方法。重要的是,这些参数不是结果存在类型的一部分

另一方面,从表面上看,概念是一个(零?)或多个类型的谓词,可用于限制模板。显然,它们与存在类型没有任何关系——除非你考虑<代码>需要< /COD>子句。< /P> 基本上,
要求
允许您测试类型的某些属性。其中包括它们是否定义了某个成员类型、是否具有某个成员功能、是否可转换为某个类型等。这一观察结果(实际上是设计的要点)是问题的关键所在

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

容器
概念为例。您可以使用Concepts Lite编写以下内容

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

// Later
print (std::vector <int> {1, 2, 3, 4});
无效打印(容器c){
用于(常数自动和电气:c)
印刷品(e);
}
//后来
打印(标准::向量{1,2,3,4});

这是因为存在一些类型
I
,表达式
begin(c)
end(c)
返回类型
I
的对象,以及
容器的其他约束。这是存在量化<代码>容器
是一种存在类型。

为什么要在这个问题中添加“语言律师”标记?因为这不是一个关于代码的问题。概念lite是任意类型的谓词。概念的原始设计功能更强大。当您可以使用
静态断言时,您不需要启用
if
,因此任何满足协议的泛型都是存在的
fn print(T)
T是存在主义
void print (Container c) {
    for (const auto& e : c)
        print (e);
}

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