CRTP 在多继承中的妙用

多态是 C++ 面向对象编程的一个重要并且非常常用的特性,我们可能基于 Base 类实现了 Derived1 和 Derived2 类。根据开发的需求,我们可能继续分别派生 Derived1 和 Derived2 到 Derived1_A 和 Derived2_A 类。如果此时我们有了新的接口需求,但不能修改 Base 类(比如我们的开发准则不允许我们改动这部分代码,况且 Derived1 和 Derived2 也不需要这个接口),因此只能新增一个 Interface 接口类来为 Derived1_A 和 Derived2_A 提供新的接口。此时问题就出现了,如果 Interface 的实现中,我们可能需要访问到 Base 类中的成员变量,那么如何实现呢?最直观的想法是为 Derived1_A 和 Derived2_A 分别实现 Interface,但是有很多实现可以共用,我们没必要写重复的代码,但是 Interface 类本身又无法访问到 Base 类的成员(不能让 Interface 继承 Base,这样 Derived1_A 与 Derived2_A 多继承时就存在问题),该怎么办呢?此时 CRTP 就可以发挥它的妙用了。

发布于 编程开发

C++ 类型萃取

最近在网上冲浪的时候注意到了 <cmath> 中 sqrt 这个求平方根的函数。与 C 语言中的不同,C++ 将它重定义为了模板函数。在使用过程中我发现,这个函数的模板特化只能用整数类型,如果是其他类型,则会编译报错。

发布于 编程开发