You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 11:27:03