c++ - 当我们已经有了类和接口(interface)时,为什么要构思概念(泛型编程)?

标签 c++ oop generic-programming c++-concepts

Also on programmers.stackexchange.com :

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

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

concept_map 不是非常 类似于适配器模式吗?如果所有方法都是内联的,则适配器在编译期之后基本上不存在;编译器只是将对接口(interface)的调用替换为内联版本,在运行时直接调用目标对象。

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

我希望这已经足够清楚了。如果你认为我不是,我可以重写它;请告诉我。

最佳答案

OOP 和泛型编程有很大的区别,命中注定

在 OOP 中,当您设计类时,您拥有认为有用的接口(interface)。完成了。

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

Concepts 的优点是你没有宿命论,你可以从 Library1 中选择一个类,从 Library2 中选择一个方法,如果合适,你就是金子(如果不合适,你也许可以使用概念图)。在 OO 中,您每次都需要编写一个成熟的适配器。

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

关于c++ - 当我们已经有了类和接口(interface)时,为什么要构思概念(泛型编程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7279802/

相关文章:

c++ - 为什么 is_sorted 不能与 greater_equal 一起正常工作?

c++ - std::get<0>(...) 和枚举索引

c++ - 未定义的行为和顺序点

javascript - 扩展 Aloha Editor 的格式插件

c++ - OpenGL,如何创建 "bumpy Polygon"?

c++ - 使用指针,不调用重写的方法

c# - 将父类(super class)传递给 C# 函数(带有 Java 序曲)

generic-programming - Agda中的Arity泛型编程

java - 在泛型上调用 Enum.values()

c++ - 带有 std::conditional 的模板函数自动返回类型