我有一个很快的问题,可能有点傻,但希望有人能够为我解决问题。
基本上,我有一个类'Test',它有一个存储类型'A'的参数对象,其中还有其他几个类,如'B','C','D',它们都扩展为'A'。< / p>
我想知道我是否可以使用此参数(ObjectType)来创建该类型的新对象,即在转换时使用它。
我可以执行以下操作来创建父类型
的新对象 AA* NewObject = SpawnObject<AA>();
但是我想知道我是否可以做任何允许我使用我存储的参数的事情,即如果参数是对象类型'B'它会知道:
AA* NewObject = SpawnObject<AB>();
即。基本上我问是否有任何方法可以实现以下,其中ObjectType是存储的参数
AA* NewObject = SpawnObject<ObjectType>();
非常感谢任何帮助。
答案 0 :(得分:1)
是的,试试这个:
struct A
{
~virtual A() = default;
// ...
};
struct Test
{
explicit Test(std::unique_ptr<A> a) : a_(std::move(a)) {}
std::unique_ptr<A> a_;
};
template <typename T>
Test * SpawnObject()
{
return new Test(std::make_unique<T>());
}
用法:
struct B : A {};
Test * p = SpawnObject<B>();
当然,你根本不应该使用裸new
:
template <typename T>
std::unique_ptr<Test> SpawnObject()
{
return std::make_unique<Test>(std::make_unique<T>());
}
您还可以扩展maker函数,以便将任意参数转发给派生类构造函数,以防它们不具有相同的构造函数签名。或者你可能根本没有使用maker函数,只是直接实例化Test
个对象,使用适当类型的make_unique
作为构造函数参数。