C ++你可以使用引用

时间:2016-06-21 10:04:57

标签: c++ casting

我有一个很快的问题,可能有点傻,但希望有人能够为我解决问题。

基本上,我有一个类'Test',它有一个存储类型'A'的参数对象,其中还有其他几个类,如'B','C','D',它们都扩展为'A'。< / p>

我想知道我是否可以使用此参数(ObjectType)来创建该类型的新对象,即在转换时使用它。

我可以执行以下操作来创建父类型

的新对象

AA* NewObject = SpawnObject<AA>();

但是我想知道我是否可以做任何允许我使用我存储的参数的事情,即如果参数是对象类型'B'它会知道:

AA* NewObject = SpawnObject<AB>();

即。基本上我问是否有任何方法可以实现以下,其中ObjectType是存储的参数

AA* NewObject = SpawnObject<ObjectType>();

非常感谢任何帮助。

1 个答案:

答案 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作为构造函数参数。