C ++模板函数需要float或double

Jon*_*let 1 c++ c++11

我想编写一个模板函数,该模板函数可同时用于double和float,如下所示:

template <typename T>
constexpr auto someCalc(const T x) {
    return x * 4.0 + 3.0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,并且4.0和 3.0都是双精度字面量,因此在clang上出现以下错误:

error: implicit conversion increases floating-point precision: 'const float' to 'double' [-Werror,-Wdouble-promotion]
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方式编写此代码而无需将上转换倍增?我能想到的最好的是

template <typename T>
constexpr auto someCalc(const T x) {
    constexpr T four = 4.0;
    constexpr T three = 3.0;
    return x * four + three;
}
Run Code Online (Sandbox Code Playgroud)

对于较大/更复杂的功能,我发现它的可读性较差,难以维护。

Hol*_*Cat 5

我会这样:

template <typename T>
constexpr auto someCalc(const T x) {
    return x * T(4.0) + T(3.0);
}
Run Code Online (Sandbox Code Playgroud)

或者static_cast,如果您愿意,可以使用。