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

C++中如何用decltype配合带参数构造函数创建对象?

解决方法

首先纠正一个用法误区:decltype(Tchild)这种写法完全冗余——Tchild本身就是类类型,直接写Tchild即可。你的核心需求是通过已有变量推导类型,再用该类型创建带参数的对象,具体实现如下:

  • 如果你已经有实例变量Tchild def;,要推导它的类型并调用带参构造函数,只需在new后跟上decltype(def),再用括号传入参数:

    std::vector<T*> vec;
    Tchild def; // 假设已存在该变量
    vec.push_back(new decltype(def)(10)); // 传入int参数10,调用Tchild(int b)构造函数
    

    这里decltype(def)会推导出Tchild类型,new decltype(def)(10)等价于new Tchild(10),优势在于后续若修改def的类型(比如换成T的其他子类),这段代码无需改动。

  • 若没有现成变量,可借助std::declval推导类型(需包含<utility>头文件),适合只想用类型名推导但不想创建临时对象的场景:

    #include <utility>
    
    std::vector<T*> vec;
    vec.push_back(new decltype(std::declval<Tchild>())(20)); // 传入参数20构造Tchild对象
    

    std::declval<Tchild>()会返回Tchild类型的右值引用,decltype据此推导出Tchild类型,同样能调用带参构造函数。

另外要注意:你原本的new decltype(Tchild)写法不仅冗余,还因未传参会尝试调用默认构造函数,但你的类仅存在带int参数的构造函数,编译必然报错,上述写法才是正确调用带参构造的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:47:12