C++静态多态与Mixin

本文探讨了C++中的静态多态(CRTP)及其原理,详细阐述了如何通过CRTP实现接口扩展和静态接口。同时,介绍了Mixin的概念,解释了C++如何利用模板实现Mixin,并通过CRTP基类作为Mixin的示例进行说明。
摘要由CSDN通过智能技术生成

作者网站:http://shanwq.com/

C++静态多态与Mixin

静态多态

定义与实现原理

静态多态又叫做CRTP,全程是Curiously recurring template pattern,是基于C++模板实现的。其方法是:一个继承类 Derived,它继承自一个以 Derived为模板参数的基类 Base。原理基础是:

  • 模板参数的二次查找
#include <functional>
#include <iostream>

template <typename Derived, typename ValueType> class Base {
   
public:
  using and_then_callback = std::function<void(ValueType &)>;
  /// 函数是公共接口函数,所有继承类通过该接口实现多态
  /// 接口的实现在基类, 与虚函数相反,虚函数多态的实现在继承类
  /// 中间有两次接口的约定:
  /// 1. 因为在基类中调用继承类的方法,所以所有继承类必须实现相关方法
  /// 2. 基类的方法暴露给用户,为提供给用户的接口
  Derived &and_then(const and_then_callback &callback) {
   
    /// 将指针cast成继承类的指针
    auto derived = static_cast<Derived *>(this);
    if (derived->has_data()) {
   
      callback(derived->get_data());
      // 可以在基类中调用继承类的成员,这也是这个设计模式的核心,因为按照正常逻辑,
      // 此处这个函数基类并不知道(先声明,后使用),但是因为是模板类,
      // 所以该类的实例化其实是在derived->other_implementation()之后进行的,
      // 所以编译可以通过
      derived->other_implementation();
    }
    return *derived;
  }
};

template <typename ValueType>
class Derived_A : public Base<Derived_A<ValueType>, ValueType>

{
   
public:
  template <typename... Argu> void set_data(const Argu &...args) {
   
    data = ValueType(args...);
    flag = true;
  }
  ValueType &get_data() {
    return data; }
  void other_implementation() {
   
    std::cout << "Derived_A implementation is called\n";
  }
  bool has_data() {
    return flag; }

private:
  ValueType data;
  bool flag = false;
};

template <typename ValueType>
class Derived_B : public Base<Derived_B<ValueType>, ValueType> {
   
public:
  template <typename.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值