[英]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.