Windows 在C++; 有没有易用< >强>高级类或库< /St> >,让您在VisualC++中与变体< /代码>交互?

Windows 在C++; 有没有易用< >强>高级类或库< /St> >,让您在VisualC++中与变体< /代码>交互?,windows,visual-c++,variant,Windows,Visual C++,Variant,更具体地说,我想在POD类型(例如double,long)、字符串(例如CString)和容器(例如std::vector)和VARIANT之间进行转换。例如: long val = 42; VARIANT var; if (ToVariant(val, var)) ... // tries to convert long -> VARIANT comObjPtr->someFunc(var); std::vector<double> vec; VARIANT

更具体地说,我想在POD类型(例如
double
long
)、字符串(例如
CString
)和容器(例如
std::vector
)和
VARIANT
之间进行转换。例如:

long val = 42;
VARIANT var;
if (ToVariant(val, var)) ...     // tries to convert long -> VARIANT
comObjPtr->someFunc(var);

std::vector<double> vec;
VARIANT var = comObjPtr->otherFunc();
if (FromVariant(var, vec)) ...   // tries VARIANT -> std::vector<double>
long val=42;
变异变量;
if(ToVariant(val,var))…//尝试转换长->变量
comObjPtr->someFunc(var);
std::vec;
变量var=comObjPtr->otherFunc();
if(FromVariant(var,vec))…//尝试变量->标准::向量
我(天真地?)假设使用COM的人总是这样做,所以很可能会有一个方便的库来处理各种转换。但我所能找到的只是各种各样的包装器类,每种包装器类都转换了几种类型:

  • 或用于吊舱类型
  • ,或用于字符串
  • 或用于阵列
除了切换到Visual Basic,还有什么简单的方法可以避免这种糟糕的内存管理和按位
VT_数组| VT_I4
code的噩梦吗

相关问题:


好吧,使用各种包装器类已经为您完成了大部分艰苦的工作。我更喜欢_variant_t和_bstr_t,因为它们更适合转换成POD类型和字符串。对于简单数组,您真正需要的只是模板转换函数。如下所示:

// parameter validation and error checking omitted for clarity
template<typename T>
void FromVariant(VARIANT Var, std::vector<T>& Vec)
{
    CComSafeArray<T> SafeArray;
    SafeArray.Attach(Var.parray);
    ULONG Count = SafeArray.GetCount();
    Vec.resize(Count);
    for(ULONG Index = 0; Index < Count; Index++)
    {
        Vec[Index] = SafeArray[Index];
    }
}
....
std::vector<double> Vec;
VARIANT Var = ...;
FromVariant(Var, Vec);
...
//为了清晰起见,省略了参数验证和错误检查
模板
void FromVariant(变量变量、标准::向量和向量)
{
CCOMSA射线安全阵列;
SafeArray.Attach(Var.parray);
ULONG Count=SafeArray.GetCount();
调整向量大小(计数);
对于(ULONG索引=0;索引<计数;索引++)
{
Vec[Index]=SafeArray[Index];
}
}
....
std::Vec;
变量Var=。。。;
FromVariant(Var,Vec);
...

当然,如果数组包含非POD类型,事情会变得棘手(关于内存/生存期管理),但它仍然是可行的。

这个问题并不真正适用于[c++](没有该结构),只是视觉方言。对于任何好奇POD是什么意思的人来说,这里有一个堆栈溢出的答案。谢谢——这很有用,我已经完全听天由命了。正如您所说,缺少的是非POD支持,可能还有类型检查/强制(例如,将double的变体转换为int的向量)。