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
完全有效?
答案 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。