模板和is_same()不起作用?

Template and is_same() doesn't work?

本文关键字:不起作用 same is      更新时间:2023-10-16
if (std::is_same<T, float>::value)
    {
        float a;
        somefunc_float(x,len,&a);
    }

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

现在我们有了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 constexpr是常规if语句的编译时求值变体,在某种程度上类似于预处理器#if

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

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

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

在未来的c++版本(可能是c++ 17)中有关于static if功能的建议,它将支持您正在尝试做的事情。

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

试试这样写:

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);
    // ...
}