(VariantCopy) VARIANT имеет функцию копирования по умолчанию, или мне нужно написать copy-function & overider operator = - PullRequest
0 голосов
/ 17 мая 2019

Проблема копирования 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

Ответы [ 2 ]

1 голос
/ 17 мая 2019

это нормально?

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;
  }
} 
0 голосов
/ 20 мая 2019

Я думаю, вы не понимаете семантику копирования и ссылок на 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;
}
...