【问题标题】:Does it make sense to replace Interfaces/Pure Abstract Classes with Concepts?用概念替换接口/纯抽象类有意义吗?
【发布时间】:2019-05-17 09:56:02
【问题描述】:

据我了解,一些概念与接口非常相似:与接口一样,概念允许定义某种方法/概念/接口的集合,实现期望并需要这些方法/概念/接口来执行其任务。两者都加强了对语义需求的关注。

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

好处显而易见:

  • 无运行时成本(v-table)
  • 一种鸭子类型,因为合适的类不必实现接口
  • 参数之间的偶数关系(接口根本不支持)

当然劣势不远了:

  • 没有模板定义检查概念,至少现在是这样

我想知道是否还有更多这些,毕竟这是否没有意义。

我知道有类似的问题,但它们的目的并不具体,也没有答案。我还发现其他人也有同样的想法,但从来没有人真正鼓励/反对这一点,更不用说争论了。

【问题讨论】:

  • "没有模板定义检查概念,至少现在是这样" 你几乎可以删除“至少现在”限定词:我向你保证定义检查是 永远不会在 C++ 中发生。
  • 你为什么这么肯定? (稍后会忙于您的回复,谢谢)
  • 你为什么这么肯定?” 首先,SG8 for Concepts is considered "dormant",这意味着他们没有活跃的工作。如果您要对概念进行定义检查,那么可能应该涉及 Concepts SG。此外,仅去年一年就有数百个提案; 没有一个是为了这个。他们甚至都没有谈论它。

标签: c++ c++20


【解决方案1】:

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

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

模板在编译时被实例化。因此,必须在编译时验证有关其接口的所有内容。您不能更改用于模板的接口实现;它被静态写入您的程序,并且模板被实例化为完全且仅使用您在代码中拼写的类型。这就是编译时多态性。

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

如果您一直在使用抽象基类来实现编译时多态性,那么您一直在做错事,您应该在概念出现之前就停下来。

【讨论】:

  • 再次感谢您的回答 - 事实上,我也将接口用于“可能编译时”多态性。仅仅因为模板有很多缺点:没有定义接口(!各个接口最多由类内部隐式定义,如果我错了,请纠正我),需要在头文件中定义函数,调试更困难......当然可能会有性能成本。所以,回到问题:我写这个问题的时候并没有考虑运行时/编译时多态的概念。
  • 因此,当编译时多态适用时,我可能更应该问它是否有意义。
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
相关资源
最近更新 更多