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

上面的代码来自一个模板,它接受一个指针 x,它可以是一些原始数据类型的指针(例如 x 是double *, float *or int *),并且somefunc_float来自一个库,只能接受一个特定的数据类型xfloat *在上面的例子中),编译器总是给我错误,告诉我输入数据类型(x)不正确,好像表达式std::is_same<T, float>::value根本不起作用?

4

3 回答 3

2

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

模板不能那样工作。当一个模板被实例化时,整个模板都会被检查和编译,并且代码必须是正确的,然后优化器才能丢弃代码块(在这种情况下它可能会丢弃)。

获得该行为的常用方法是提供使用不同类型调用的模板(或非模板重载)的多个实现。编译器将在调用位置分派给适当的实现,然后忽略其余部分。


在未来版本的 C++(可能是 C++17)中,有一些功能提案static if可以支持您正在尝试做的事情。

于 2013-01-13T23:43:49.310 回答
2

现在我们有了 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);
}

有关更多信息,请参阅if 的文档。

于 2021-01-09T08:48:20.970 回答
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);

    // ...
}
于 2013-01-13T23:46:04.693 回答