C++17下如何实现可参数化选择CRTP基类的派生类
C++17下可指定CRTP基类的派生类实现
你给出的原始代码本身不存在语法层面的递归错误,这正是CRTP模式的标准写法,在C++17标准下可以正常编译运行。如果需要更通用的适配能力,可以参考以下实现方案:
基础实现(单基类版本)
// CRTP基类定义 template <typename TDerived> class Base1 { public: void base1_func() { // CRTP标准写法:静态转换为派生类指针调用派生类方法 static_cast<TDerived*>(this)->common_derived_func(); } }; template <typename TDerived> class Base2 { public: void base2_func() { static_cast<TDerived*>(this)->common_derived_func(); } }; // 可指定基类的派生类,原写法合法无递归问题 template <template <typename> class TBase> class Derived : public TBase<Derived<TBase>> { public: void common_derived_func() { // 派生类通用业务逻辑 } };
使用示例
// 实例化继承Base1的派生类 Derived<Base1> d1; d1.base1_func(); // 实例化继承Base2的派生类 Derived<Base2> d2; d2.base2_func();
扩展实现(多基类版本)
如果需要支持同时继承多个符合CRTP规范的基类,可以借助C++17的可变模板参数实现:
template <template <typename> class... TBases> class MultiDerived : public TBases<MultiDerived<TBases...>>... { public: void common_derived_func() { // 派生类通用业务逻辑 } };
使用示例
// 同时继承Base1和Base2 MultiDerived<Base1, Base2> d; d.base1_func(); d.base2_func();
关于你提到的递归问题说明:CRTP模式中仅把派生类类型作为模板参数传递给基类,模板实例化只会做类型推导,不会触发无限的类型生成递归,这是C++标准明确支持的合法写法。
内容的提问来源于stack exchange,提问作者TruLa
相关产品推荐
相关产品推荐

