如何使用三元运算符制作指向多态类的唯一指针?

LT2*_*21j 4 c++ conditional-operator c++11 c++14

我正在尝试使用三元运算符设置变量。但是,编译器抱怨类型不兼容。我确定有办法做到这一点。我已尝试对基类进行静态转换,但无法获得正确的语法。

#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();
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 5

三元表达式的返回值是两个表达式的通用类型(实际上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>();
Run Code Online (Sandbox Code Playgroud)

演示