模板和is_same()不起作用?

时间:2013-01-13 23:35:47

标签: c++ templates

if (std::is_same<T, float>::value)
    {
        float a;
        somefunc_float(x,len,&a);
    }

上面的代码来自一个模板,它接受一个指针x,它可以是一些原始数据类型的指针(例如x为double *float *int *),以及somefunc_float来自lib,只能接受x(上例中的float *)的一种特定数据类型,编译器总是给我错误,告诉我输入数据类型(x )是不正确的,好像表达式std::is_same<T, float>::value完全有效?

3 个答案:

答案 0 :(得分:2)

问题的描述并不完全清楚,但我想我明白你要做的是:你在模板函数中包含一个代码块,可以在编译时执行测试,并期望编译器将丢弃该块而不编译它。

模板不会那样工作。实例化模板时,在优化器可以丢弃代码块(在这种情况下可能会丢弃)之前,检查并编译整个模板并且代码必须正确。

获取该行为的常用方法是提供使用不同类型调用的模板(或非模板重载)的多个实现。编译器将在调用地点调度相应的实现,然后忽略其余的。


在未来的C ++版本(可能是C ++ 17)中,有static if功能的提议可以支持你想要做的事情。

答案 1 :(得分:1)

类型是静态确定的,并且实例化的所有模板代码都必须编译,即有意义。即使条件为假,if语句的内容也必须有意义。

尝试这样的事情:

template <typename T> execute_if_float(T) { }

execute_if_float(float x) { somefunc_float(x); }


template <typename T> void myCode(T x)
{
    // ...

    execute_if_float(x);

    // ...
}

答案 2 :(得分:1)

既然我们有了 C++17,你的方法就变得有效了。但是,需要对语法稍作更正:

// is_same_v is an alias for is_same<...>::value
if constexpr (std::is_same_v<T, float>) {  
    float a;
    somefunc_float(x,len,&a);
}

有关详细信息,请参阅 documentation of if