用到的技术都懂,想表达的思想大概懂,但依我愚见,没讲通透。
1 concept的定义,本质是是对 std::is_base_of()这类函数的泛化,从“派生自”到“有某traits”,总之还是要分类。
template <typename T>
concept supportArea = requires(T v)
{
v.getArea()
};
2 前面动物、鲨鱼、鲸鱼、鸭子的例子很好,引出的痛点清晰,后面为什么突然换成面积了?如果设计代码例子,清晰并解决鸭子的痛点,逻辑更强。
3 面积的例子没有难度。无非是从基类接口GetArea方法(成员),转成自由函数(非成员)。这自由函数,也免不了一直加if...else...分支的命运,如果有新类加入。而且新类都要增加traits, 就像侵入Circle类一样,增加traits。
【 在 spoon123 的大作中提到: 】
: 老规矩,先解释一下标题,我承认有点标题党,其实就是为了抓人眼球,希望通过这种标题吸引你点进来看看。我有自信这是一篇好文章。我曾经写过一篇很有名的博客:《为什么C语言不会过时》 很多的网络媒体都进行了转载。我相信这篇博客的质量应该比《为什么C语言不会过时》还好。因为它会颠覆你对C++面向对象编程的传统的认知。
: 再详细解释一下什么是非耍流氓。其实C++面向对象编程的问题,很多大牛都讨论过,但是因为人家是大牛,所以文字描述居多,很少给出代码。人家毕竟是阅近天下**, 心中早已无码。我个人认为讨论编程的问题,如果你不给出代码就是在耍流氓。 而一些C++初学者,倒是愿意给出一大堆关于什么dog继承animal的类似的源代码,但是这样讨论面向对象编程有些肤浅,片面,甚至是把人带向了错误的方向。所以我这篇文章首先要基于源代码的方式讨论面向对象,而且介绍现代方式的面向对象编程,你会惊讶的发现,无论是从理念上,还是实现方式上,它都和传统意义的面向对象编程截然不同。
: 我刚开始接触C++的面向对象的时候,首先接触的例子就是duck是animal, student是一个people等等那一套。这种例子铺天盖地,充斥于各种C++的各种初级书本中。我相信大部分人和我都有一样的记忆。当时感觉这个面向貌似没什么难的。但是当自己写程序的时候,大部分时间都根本没怎么使用到继承。这个是第一个层次。
: ...................
--
FROM 61.185.187.*