C++ C++;模板函数跳过静态函数调用
我有一个类,它具有将基本类型转换为_variant类型的静态函数:C++ C++;模板函数跳过静态函数调用,c++,templates,C++,Templates,我有一个类,它具有将基本类型转换为_variant类型的静态函数: 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 &
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);
}
void doSomething(\u变体\u t);
模板
无效处理变量(T值){
_变异体;
VariantConverter::ToVariant(值,变量);//跳过!!!!
doSomething(Variant);//用_Variant做点什么
}
int main(){
过程变量(1);
过程变量(1.1);
}
上面的代码不起作用,因此我进行了调试,以找出问题所在 事实证明,调用ToVariant的整行代码都被跳过了! (当我为每一行设置断点并持续点击“Continue”时,它只会忽略ToVarian行并直接进入doSomething)
为什么在MSVC13上根本没有调用ToVariant方法这对我来说很好:
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);
}
结构变量{
int intVal;
双dblVal;
};
类变量转换器{
公众:
静态变量(int值、变量和变量){
//Variant.vt=vt_I4;
Variant.intVal=值;
}
静态变量(双值、变量和变量){
//Variant.vt=vt_R8;
Variant.dblVal=值;
}
//静态void ToVariant(标准::字符串值、\u variant\u variant&variant){
//Variant.SetString(Value.c_str());
//}
//静态变量(布尔值、变量和变量){
//Variant.vt=vt_BOOL;
//Variant.boolVal=值;
//}
};
无效剂量测定法(_变体_t){}
模板
无效处理变量(T值){
_变异体;
VariantConverter::ToVariant(值,变量);//未跳过!!!!
doSomething(Variant);//用_Variant做点什么
}
int main(int argc,char*argv[])
{
过程变量(1);
过程变量(1.1);
}
如果您使用的是发布模式断点,那么断点可能会非常奇怪。优化器正在变得越来越智能,如果
doSomething
在另一个编译单元中,它有时会发现您没有使用参数,因此无法使用参数。@t.C.很抱歉,这是一个输入错误。我更新了它。@Igor函数重载。@Igor查找函数模板参数推断。@user2436815虚值。我有点希望我们能否决评论。。。无论如何,在VS2013的发布模式下,每次调用ProcessVariant
时,我都会两次点击ToVariant
和doSomething
行上的断点。@T.C.感谢您的评论。问题在于VS中的释放模式。