Инициализировать STD :: вариант ? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть класс, который выглядит примерно так:

class X
{
  std::variant<CComPtr<ID2D1HwndRenderTarget>, CComPtr<ID2D1DCRenderTarget>> mpRenderTarget;
  void init();
}

// To early to know which member we need, it's no value until derived class calls init() method.
X::X() : mpRenderTarget(nullptr)

void X::init()
{
   // Only here it is known what exactly to initialize!
   // and this is going to be in derived class, this one pure virtual.
}

Проблема в том, что этот конструктор не компилируется, потому что инициализация варианта недопустима, однако, если я пропускаю инициализацию mpRenderTarget в конструкторе тогда другая проблема заключается в том, что вариант «искажен» согласно стандарту.

Я просто хочу инициализировать его в конструкторе по умолчанию, но как?

1 Ответ

3 голосов
/ 28 апреля 2020

Просто присвойте ему значение по умолчанию one для типов:

X::X() : mpRenderTarget(CComPtr<ID2D1HwndRenderTarget>{}) {}

Вы также можете указать, что значением указателя по умолчанию является nullptr:

X::X() : mpRenderTarget(CComPtr<ID2D1HwndRenderTarget>{nullptr}) {}

Важной частью является то, что вы должны указать, с каким типом variant вы хотите инициализировать объект.

...