C++ 用概念替换接口/纯抽象类有意义吗?

C++ 用概念替换接口/纯抽象类有意义吗?,c++,c++20,C++,C++20,正如我所理解的,概念与接口非常相似:与接口一样,概念允许定义一组方法/概念/接口,实现期望并需要这些方法/概念/接口来执行其任务。两者都加强了对语义需求的关注 虽然比亚恩和其他许多人似乎认为概念是摆脱使用enable_if和一般复杂模板的方法,但我想知道使用它而不是使用接口/纯抽象类是否有意义 好处显而易见: 无运行时成本(v表) 一种duck类型,因为合适的类不必实现接口 甚至参数之间的关系(接口根本不支持) 当然,一个不利因素并不遥远: 没有检查概念的模板定义,至少目前是这样 我想

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

虽然比亚恩和其他许多人似乎认为概念是摆脱使用enable_if和一般复杂模板的方法,但我想知道使用它而不是使用接口/纯抽象类是否有意义

好处显而易见:

  • 无运行时成本(v表)
  • 一种duck类型,因为合适的类不必实现接口
  • 甚至参数之间的关系(接口根本不支持)
当然,一个不利因素并不遥远:

  • 没有检查概念的模板定义,至少目前是这样
我想知道是否还有更多这样的问题,这到底是不是毫无意义


我知道也有类似的问题,但这些问题既没有明确的目的,也没有在答复中得到答复。我还发现其他人也有同样的想法,但在任何时候都没有人真正鼓励/反对这一点,更不用说对此进行争论了。

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

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

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

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


如果您一直在使用抽象基类进行编译时多态性,那么您做的事情是错误的,您应该早在概念出现之前就停止了。

“没有模板定义检查概念,至少现在”您可以删除“至少现在”限定符:我向你保证,在C++中决不会发生定义检查。你为什么这么肯定?(稍后我会忙于你的回复,谢谢你)“你为什么这么肯定?”这意味着他们没有积极的工作。如果要对概念进行定义检查,那么可能需要涉及概念SG。此外,仅去年一年就有数百项提案;他们中没有一个人赞成这个。再次感谢你的回答——事实上,我也使用接口来实现“可能的编译时”多态性。只是因为模板有很多缺点:没有接口的定义(!接口最多由类内部隐式定义,如果我错了请纠正我),需要在头中定义函数,调试更困难。。。当然,可能会有性能成本。因此,回到问题上来:我在写这个问题时没有考虑运行时/编译时多态性的概念。因此,我可能更应该问,当编译时多态性适用时,它是否有意义。