簡體   English   中英

如何使用三元運算符創建指向多態類的唯一指針?

[英]How to make unique pointers to polymorphic classes using the ternary operator?

我正在嘗試使用三元運算符設置變量。 但是,編譯器抱怨不兼容的類型。 我確信有辦法做到這一點。 我已經嘗試將 static 轉換為基礎 class,但我無法獲得正確的語法。

#include <iostream>
#include <memory>
struct A
{
    virtual ~A() = default;
    virtual void test() {std::cout << "A" << std::endl;} 
};

struct B: public A
{
    void test() final {std::cout << "B" << std::endl;} 
};

struct C: public A
{
    void test() final {std::cout << "C" << std::endl;} 
};

int main()
{
    bool t = true;
    // Try to cast try a base unique class ptr. Maybe use static_cast??
    std::unique_ptr<A> aptr = t ? std::make_unique<B>(): std::make_unique<C>();
    aptr->test();
}

三元表達式的返回值是兩個表達式的共同類型(實際上std::common_type可能使用三元運算符作為其實現的一部分:-) )。

std::unique_ptr<B>std::unique_ptr<C>是不相關的類型,

std::unique_ptr<B>std::unique_ptr<C>都可以轉換為std::unique_ptr<A> ,因此顯式轉換一個就足夠了:

auto aptr = t ? std::unique_ptr<A>{std::make_unique<B>()}
              : std::make_unique<C>();

演示

嘗試這個:

std::unique_ptr<A> aptr = t ? std::unique_ptr<A>(new B()): std::unique_ptr<A>(new C());

您可以直接調用構造函數:

std::unique_ptr<A> aptr(t ? std::make_unique<B>(): std::make_unique<C>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM