(VariantCopy) VARIANT 是否具有默认复制功能,或者我是否必须编写复制功能 & overider operator =

(VariantCopy) does VARIANT have default-copy function, or do i have to write copy-function & overider operator =

VARIANT 复制问题,适用于多线程

VARIANT 是否具有默认复制功能,或者我是否必须编写复制功能和覆盖操作符 =

https://docs.microsoft.com/en-us/windows/desktop/winauto/variant-structure

https://docs.microsoft.com/en-us/windows/desktop/api/oaidl/ns-oaidl-tagvariant

这样可以吗?

class Data() 
{
protected:
  VARIANT m_var;
public:
  Data()
  {
    VariantInit(&m_var);
  }
  ~Data()
  {
    VariantClear(&m_var);
  }

  Data(const Data& other)
  {
    VariantInit(&m_var);
    VariantCopy(&m_var, &other.m_var);
  }
  Data& operator = (const Data& other)
  {
    if(this == &other)
        return *this;
    VariantInit(&m_var);
    VariantCopy(&m_var, &other.m_var);
    return *this;
  }

  Data(Data&& other)
  {
    VariantInit(&m_var);
    VariantCopy(&m_var, &other.m_var);
    VariantClear(&other.m_var);
  }
  Data& operator = (Data&& d)
  {
    if(this == &other)
        return *this;
    VariantInit(&m_var);
    VariantCopy(&m_var, &other.m_var);
    VariantClear(&other.m_var);
    return *this;
  }
} 

我认为您不了解 C++ 复制和引用语义。下面是一个示例,说明如何在三种不同类型的参数调用中使用 _variant_t 代替 VARIANT:复制、引用、指针。

#include <windows.h>
#include <comdef.h>
#include <iostream>
using namespace std;


void DoSomething(VARIANT v)
{
    _variant_t vConv;

    VariantChangeType(&vConv, &v, 0, VT_BSTR);

    wcout <<  vConv.bstrVal << endl;
}

void DoSomethingWithRef(const VARIANT& v)
{
    _variant_t vConv;

    VariantChangeType(&vConv, &v, 0, VT_BSTR);

    wcout <<  vConv.bstrVal << endl;

}


void DoSomethingWithPtr(const VARIANT* pv)
{
    _variant_t vConv;

    VariantChangeType(&vConv, pv, 0, VT_BSTR);

    wcout <<  vConv.bstrVal << endl;

}

int main(int argc, char* argv[])
{
    _variant_t v_t(123L);

    DoSomething(v_t);

    DoSomethingWithRef(v_t);

    DoSomethingWithPtr(&v_t);

    return 0;
}