C++ C++;模板函数跳过静态函数调用

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 &

我有一个类,它具有将基本类型转换为_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 &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中的释放模式。