在 C++ 模板函数中使用类型特征,是否可以将值转换为相同类型的 T?

Using type traits in C++ template functions, is it possible to convert a value to a T of the same type?

我正在尝试编写这样的模板函数

template<typename T>
T doSomething() { 
    //Code

    if (std::is_same<T, int>::value) { 
        return getInt();   // A library function returning an int
    } else if (std::is_same<T, bool>::value) {
        return getBool();  // A library function returning a bool
    } else { 
        throw;
    }
}

根据给定的模板参数调用不同的函数,returns 是一个在运行时保证与 T 具有相同类型的值。 但是,编译器给我这个错误:'return': cannot convert from 'int' to 'T' 我想我可以使用 reinterpret_cast 之类的东西,但在这种情况下这似乎是不安全和不好的做法。

那么,有没有办法根据 C++ 中的模板参数从模板函数中 return 不同的类型?

So, is there a way to return different types from a template function depending on the template parameter in C++?

是的,你可以使用 C++17 constexpr if

template<typename T>
T doSomething() { 
    //Code

    if constexpr (std::is_same<T, int>::value) { 
        return getInt();   // A library function returning an int
    } else if constexpr (std::is_same<T, bool>::value) {
        return getBool();  // A library function returning a bool
    } else { 
        throw;
    }
}

除了constexpr if(对于pre-c++17)你还可以使用显式特化,如下所示:

template<typename T> //primary template
T doSomething() { 
    std::cout<<"throw version"<<std::endl;
    throw;
}

template<> //specialization for int
int doSomething<int>() { 
    std::cout<<"int version"<<std::endl;
    return getInt();
}

template<>//specialization for bool
bool doSomething<bool>() { 
    std::cout<<"bool version"<<std::endl;
    return getBool();
}

Demo.