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

C++能否在基类中获取子类类型,实现类似D语言返回子类实例的功能?

C++没有和你使用的D语言特性完全对等的原生语法,但可以通过**奇异递归模板模式(CRTP)**实现需求,不需要用到typeid——typeid是运行时类型信息,只能用来做运行时类型比对,无法作为类型标识符用于编译期的类型声明、模板实例化,完全满足不了你的需求。

实现代码

template <typename Derived, typename T>
class A
{
public:
    T commonData;
    // Derived就是你要的TYPEOF_CHILD_CLASS,编译期确定类型
    Derived *test(T data)
    {
        return new Derived(data);
    }
};

template <typename T>
// 继承时把当前派生类作为第一个模板参数传入基类
class B : public A<B<T>, T>
{
public:
    T bdata;
    B(T data)
    {
        bdata = data;
    }
};

template <typename T>
class C : public A<C<T>, T>
{
public:
    T cdata;
    C(T data)
    {
        cdata = data;
    }
};

int main(int argc, char const *argv[])
{
    auto a = C<int>(1).test(2);
    // a的类型就是C<int>*,和你预期的功能完全一致
    delete a;
    return 0;
}

补充说明

CRTP是C++常用的编译期多态技术,所有逻辑都在编译期完成,没有运行时开销,和你在D语言中用模板实现的效果完全等价。

内容的提问来源于stack exchange,提问作者Wusiki Jeronii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:09:04