Windows 在C++; 有没有易用< >强>高级类或库< /St> >,让您在VisualC++中与变体< /代码>交互?
更具体地说,我想在POD类型(例如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
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的人总是这样做,所以很可能会有一个方便的库来处理各种转换。但我所能找到的只是各种各样的包装器类,每种包装器类都转换了几种类型:
- 或用于吊舱类型
- ,或用于字符串
- 或用于阵列
VT_数组| VT_I4
code的噩梦吗
相关问题:
// 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的向量)。