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

时间:2014-07-24 18:08:55

标签: c++ templates

我有一个具有静态函数的类,它将基本类型转换为_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方法根本不被调用?

1 个答案:

答案 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位于另一个编译单元中,它有时会发现您没有使用该参数,因此无法实现。