C++类层次中实现返回*this的协变返回类型方法,如何避免代码重复?
解决C++类层次中bar()方法代码重复的问题
你可以用轻量CRTP混入类来消除重复代码,实现非常简洁,完全不需要复杂的CRTP结构:
步骤1:定义CRTP混入类
这个模板类封装了bar()的通用逻辑,通过模板参数获取子类类型,自动推导返回值:
template <typename Derived> class BarMixin { public: Derived& bar() & { // 调用基类A的foo(),通过子类转换确保访问权限 static_cast<Derived*>(this)->A::foo(); return *static_cast<Derived*>(this); } };
步骤2:改造原有类层次
让每个需要bar()方法的子类,多继承对应的BarMixin实例(模板参数为子类自身):
class A { protected: void foo() { /* 此处为A::foo的原有实现 */ } }; // B继承A和BarMixin<B>,自动获得bar() class B : public A, public BarMixin<B> {}; // C同理 class C : public A, public BarMixin<C> {}; // D继承B和BarMixin<D>,自动获得bar() class D : public B, public BarMixin<D> {};
说明
- 混入类
BarMixin仅封装bar()的通用逻辑,不会干扰原有类层次的结构。 bar()的左值限定符&保留,完全符合你规避右值问题的要求。- 所有子类无需重复编写
bar()的函数体,仅通过继承混入类即可获得功能,彻底消除代码重复。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

