初始化std::variant<Pointer, Pointer>?

Initialize std::variant<Pointer, Pointer>?

我有一个 class,看起来像这样:

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 的初始化,那么另一个问题是 根据标准,变体是 "ilformed"。

我只是想在构造函数中将它初始化为一些默认值,但是如何?

只需为其分配默认值一个类型:

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

您也可以明确指出默认指针值为 nullptr

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

重要的部分是您必须指定您要使用哪种variant类型来初始化对象。