用概念替换接口/纯抽象类是否有意义?

时间:2018-12-17 02:33:22

标签: c++ c++20

正如我所了解的,概念非常类似于接口:与接口一样,概念允许定义某种方法/概念/接口集,实现需要这些方法/概念/接口来执行其任务。两者都增强了对语义需求的关注。

虽然Bjarne和其他许多人似乎将概念视为摆脱使用enable_if和通常复杂的模板的方式,但我不知道使用它代替接口/纯抽象类是否有意义。

好处显而易见:

  • 没有运行时成本(v表)
  • 种类繁多的鸭子,因为合适的类不必实现接口
  • 参数之间的均匀关系(哪些接口根本不支持)

当然缺点也不远:

  • 至少现在没有用于概念的模板定义检查

我想知道是否还有更多,毕竟那是否没有道理。

我知道也有类似的问题,但是它们的目的并不明确,也无法在答案中回答。我还发现其他人也有相同的想法,但从来没有人真正鼓励/不鼓励这一点,更不用说对此了。

1 个答案:

答案 0 :(得分:1)

如果将抽象类用于其预期目的,则几乎没有办法用概念来代替它们。抽象基类用于运行时多态性:在运行时将接口的实现与使用该接口的站点分离的能力。您可以使用用户输入或文件中的数据来确定要创建哪个派生类实例,然后将该实例传递给使用指向基类的指针/引用的其他代码。

抽象类用于定义运行时多态性的接口。

在编译时实例化一个模板。因此,必须在编译时验证有关其接口的所有内容。您不能更改用于模板的接口的哪种实现。它被静态地写入程序中,并且模板仅使用您在代码中明确指出的类型实例化。那就是编译时的多态性。

概念用于定义编译时多态性的接口。它们在运行时不起作用。

如果您一直在使用抽象基类进行编译时多态,那么您做错了事,应该在概念问世之前就停下来了。