(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++ 的包装器,你可以使用CComVariant
。 VARIANT
没有这样的功能,因为许多语言没有像 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& 获取变体参数是不是有任何实际原因?