(VariantCopy) VARIANT 是不是具有默认复制功能,或者我是不是必须编写复制功能和覆盖运算符 =

Posted

技术标签:

【中文标题】(VariantCopy) VARIANT 是不是具有默认复制功能,或者我是不是必须编写复制功能和覆盖运算符 =【英文标题】:(VariantCopy) does VARIANT have default-copy function, or do i have to write copy-function & overider operator =(VariantCopy) VARIANT 是否具有默认复制功能,或者我是否必须编写复制功能和覆盖运算符 = 【发布时间】:2019-05-17 03:20:30 【问题描述】:

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

【问题讨论】:

如果你想要一个类似 C++ 的包装器,你可以使用CComVariantVARIANT 没有这样的功能,因为许多语言没有像 operator= 这样的东西。 谢谢。如果我必须使用 VARIANT 怎么办? 为什么你不得不使用 VARIANT 而不是它的 C++ 友好包装器之一? VARIANT 来自 3rdParty dll,我无法更改它。 你不能改变它,但你可以包装它。 【参考方案1】:

这样好吗?

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;
  
 

【讨论】:

已经有 CComVariant 和 _variant_t。你为什么需要它?而且,您的最后一个赋值运算符是 1)错误实现/错误 2)不需要,因为您已经有另一个赋值运算符。 VARIANT 来自 3rdParty dll,我无法更改它。 您的Data 类基本上是CComVariant 的重新实现,但功能更少,错误更多。为什么不直接使用CComVariant Data - 这个类来自第三个 DLL,我只需要按值传递,因为我必须通过 Data d 跨线程。 你原来的问题是关于传递一个VARIANT,没有提到Data【参考方案2】:

我认为您不了解 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;

【讨论】:

Data - 这个类来自第三个 DLL,我只需要按值传递,因为我必须通过 Data d 跨线程。

以上是关于(VariantCopy) VARIANT 是不是具有默认复制功能,或者我是不是必须编写复制功能和覆盖运算符 =的主要内容,如果未能解决你的问题,请参考以下文章

如何在 boost::variant<T> 中存储引用而不是复制对象?

xml ?variant_id =在营销Feed中(变体:id不是variant_id,它是变体产品的ID)

如何存储抽象类型的数据?将数据存储为 sql_variant 数据类型是不是明智?

std::get_if (std::variant) 通过指针而不是值/&/const& 获取变体参数是不是有任何实际原因?

Delphi的又一小缺陷: TDate赋值给Variant得到varDouble而不是varDate

Delphi Enums 到 Variant 作为 varInteger 而不是 varUInt32