11

同样在programmers.stackexchange.com 上

我知道 STL 概念必须存在,将它们称为“类”或“接口”是愚蠢的,而实际上它们只是记录(人类)概念并且当时无法翻译成 C++ 代码,但是当有机会扩展语言以适应概念时,他们为什么不简单地修改类的功能和/或引入接口?

一个概念不是类似于接口(100% 没有数据的抽象类)吗?通过观察,在我看来,接口只缺乏对公理的支持,但也许公理可以被引入 C++ 的接口中(考虑在 C++ 中假设采用接口来接管概念),不是吗?我认为即使是汽车概念也可以很容易地添加到这样的 C++ 接口中(汽车接口 LessThanComparable,有人吗?)。

一个concept_map 不是和Adapter 模式相似吗?如果所有方法都是内联的,则适配器在编译时间之后基本上不存在;编译器只是用内联版本替换对接口的调用,在运行时直接调用目标对象。

我听说过一种叫做静态面向对象编程的东西,它本质上意味着在通用编程中有效地重用面向对象的概念,从而允许使用 OOP 的大部分功能而不会产生执行开销。为什么没有进一步考虑这个想法?

我希望这足够清楚。如果您认为我不是,我可以重写它;让我知道。

4

4 回答 4

6

OOP 和 Generic Programming, Predestination之间有很大的不同。

在 OOP 中,当您设计类时,您就拥有了您认为有用的接口。它已经完成了。

另一方面,在通用编程中,只要类符合给定的一组要求(主要是方法,但也包括内部常量或类型),那么它就符合要求并且可以使用。Concept 提案是关于形式化这一点,以便在检查方法签名时直接进行检测,而不是在实例化方法体时进行。它还使检查模板方法更容易,因为如果概念不匹配,某些方法可以在不进行任何实例化的情况下被拒绝。

Concepts 的优点是你不会受 Predestination 的困扰,你可以从 Library1 中选择一个类,从 Library2 中选择一个方法,如果合适,你就是黄金(如果不合适,你也许可以使用一个概念地图)。在 OO 中,您每次都需要编写一个成熟的适配器。

你是对的,两者看起来很相似。不同之处主要在于绑定的时间(事实上,Concept 仍然具有静态调度而不是像接口那样的动态调度)。概念更开放,因此更易于使用。

于 2011-09-02T06:34:53.540 回答
3

类是命名一致性的一种形式。您通过继承来表明该类Foo符合接口。II

概念是结构和/或运行时一致性的一种形式。一个类Foo不需要预先声明它符合哪些概念。

结果是命名一致性降低了在预先不期望的地方重用类的能力,即使它们是可用的。

于 2011-09-02T08:19:03.203 回答
1

这些概念实际上不是 C++ 的一部分,它们只是概念!在 C++ 中,没有办法“定义一个概念”。您所拥有的只是templates 和classes(STL 是所有模板类,顾名思义:S tandard T emplate L ibrary )。

如果您的意思是 C++0x 而不是 C++(在这种情况下,我建议您更改标签),请阅读此处:

http://en.wikipedia.org/wiki/Concepts_(C++ )

我将为您复制粘贴的一些部分:

在 C++ 编程语言的待定 C++0x 修订版中,概念和公理的相关概念是对 C++ 模板系统的提议扩展,旨在改进编译器诊断允许程序员在程序中编写模板的一些正式属性他们写。将这些有限的形式规范结合到程序中(除了提高代码清晰度之外)可以指导一些编译器优化,并且可以通过使用形式验证工具来检查实现和规范是否实际匹配,从而潜在地帮助提高程序的可靠性。

2009 年 7 月,C++0x 委员会决定从标准草案中删除概念,因为它们被认为“尚未准备好”用于 C++0x。

引入概念的主要动机是提高编译器错误消息的质量

如您所见,概念并不是用来代替接口等的,它们只是为了帮助编译器更好地优化并产生更好的错误。

于 2011-09-02T08:32:27.550 回答
0

虽然我同意所有发布的答案,但他们似乎错过了性能这一点。与接口不同,概念是在编译时检查的,因此不需要虚函数调用。

于 2017-02-26T08:44:58.100 回答