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
相关产品推荐
相关产品推荐

