我有一个具有静态函数的类,它将基本类型转换为_variant_t类型:
class VariantConverter {
public:
static void ToVariant(int Value, _variant_t &Variant) {
Variant.vt = VT_I4;
Variant.intVal = Value;
}
static void ToVariant(double Value, _variant_t &Variant) {
Variant.vt = VT_R8;
Variant.dblVal = Value;
}
static void ToVariant(std::string Value, _variant_t &Variant) {
Variant.SetString(Value.c_str());
}
static void ToVariant(bool Value, _variant_t &Variant) {
Variant.vt = VT_BOOL;
Variant.boolVal = Value;
}
};
我正在尝试在我的模板函数中使用它,如下所示:
void doSomething(_variant_t);
template <typename T>
void ProcessVariant(T Value) {
_variant_t Variant;
VariantConverter::ToVariant(Value, Variant); // SKIPPED!!!!
doSomething(Variant); // Do something with the _variant_t
}
int main() {
ProcessVariant<int>(1);
ProcessVariant<double>(1.1);
}
上面的代码无法正常工作,所以我调试了以找出问题所在..
事实证明,跳过调用ToVariant的整行! (当我将断点设置到每一行并继续点击“继续”时,它只是忽略ToVariant行并直接转到doSomething)
为什么ToVariant方法根本不被调用?
答案 0 :(得分:1)
在MSVC13上,这对我来说很好:
struct _variant_t {
int intVal;
double dblVal;
};
class VariantConverter {
public:
static void ToVariant(int Value, _variant_t &Variant) {
//Variant.vt = VT_I4;
Variant.intVal = Value;
}
static void ToVariant(double Value, _variant_t &Variant) {
//Variant.vt = VT_R8;
Variant.dblVal = Value;
}
//static void ToVariant(std::string Value, _variant_t &Variant) {
// Variant.SetString(Value.c_str());
//}
//static void ToVariant(bool Value, _variant_t &Variant) {
// Variant.vt = VT_BOOL;
// Variant.boolVal = Value;
//}
};
void doSomething(_variant_t){}
template <typename T>
void ProcessVariant(T Value) {
_variant_t Variant;
VariantConverter::ToVariant(Value, Variant); // NOT SKIPPED!!!!
doSomething(Variant); // Do something with the _variant_t
}
int main(int argc, char *argv[])
{
ProcessVariant<int>(1);
ProcessVariant<double>(1.1);
}
如果你正在使用发布模式断点可能真的很奇怪。优化器越来越聪明,如果doSomething
位于另一个编译单元中,它有时会发现您没有使用该参数,因此无法实现。