【发布时间】:2017-07-19 01:01:54
【问题描述】:
我有以下函数模板:
template <typename TypeName>
TypeName AssignDefaultIfNull(VARIANT Variant, TypeName & Value) {
if ((Variant.vt != VT_NULL) || (Variant.vt != VT_EMPTY))
{
CComVariant CV = Variant;
if (CV.vt != TypeName) {} // << HERE I WANT TO COMPARE THOSE TWO, BUT THEY'RE DIFFERENT THINGS. >>
}
else
{
// Default Value
}
return Value;
}
有时,我使用上面的函数模板,例如:
LONG LongValue = AssignDefaultIfNull<LONG>(rcNormalPositionBottom, lpwndpl.rcNormalPosition.bottom);
我想在上面将VARIANT 的VARTYPE (vt) 与给定的类型名TypeName 进行比较,如果匹配,则对它们执行一些操作。
我尝试使用!= 运算符,但它无法比较,因为VARTYPE 是unsigned short 而TypeName 是typename。
我也试过这样:
if (CV.vt != (VARTYPE)typeid(TypeName).name()) {}
但是编译器给出警告:
C4302:“类型转换”:从“const char*”截断为“VARTYPE”
有没有办法正确比较这两种类型?
提前致谢。
【问题讨论】:
-
不清楚您的代码中
Variant指的是什么类型。如果您使用的是std::variant,您可以使用if (std::holds_alternative<TypeName>(CV)) { ... } -
好的,但是它是什么type?哪个标头定义了
VARIANT和CComVariant? -
我没有 Visual C++,但你可以试试
if (CV.vt != CComVariant(TypeName{}).vt) { ... }(需要 C++11 来实现统一的初始化语法)。这会创建一个临时的CComVariant,它包装默认初始化值TypeName并检索.vt成员。 -
在 C++11 之前这可能有效:
if (CV.vt != CComVariant((TypeName())).vt) { ... }