C++如何通过模板布尔参数有条件启用基类的成员函数
实现方案
我们可以根据你使用的C++版本选择对应的实现方式,两种方案都不会产生冗余代码,符合你提到的「B1和B2绝大多数功能逻辑一致」的需求:
方案1:C++20及以上版本(最简实现)
直接用C++20引入的requires约束控制using声明的生效条件即可:
class A { // 注意func需要是protected或public权限,派生类才能正常引入 protected: void func(); }; template <bool Use = false> class B : public A { public: // 仅当模板参数Use为true时,该using声明才会生效 using A::func requires Use; // 所有通用逻辑统一写在这里,不需要重复实现 void common_func() { // 共用逻辑代码 } };
效果验证:
B<false>调用func时不会引入基类版本,你可以自行实现派生类的funcB<true>调用func时直接使用基类A的实现
方案2:兼容C++11/14/17的版本
旧版本标准不支持requires约束using,我们可以通过模板偏特化实现,把通用逻辑抽离到公共基类避免重复:
class A { protected: void func(); }; // 公共基类:所有通用逻辑、成员变量都放在这里,两份特化类共享 template <bool Use> class B_common : public A { public: void common_func1() {} void common_func2() {} int common_val = 0; }; // 主模板:对应Use=false的场景,自行实现func template <bool Use = false> class B : public B_common<Use> { public: void func() { // 原B2类的func实现代码 } }; // 偏特化:对应Use=true的场景,引入基类的func template <> class B<true> : public B_common<true> { public: using A::func; };
内容的提问来源于stack exchange,提问作者frozenca
相关产品推荐
相关产品推荐

