我想编写一个模板函数,该模板函数可同时用于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)
对于较大/更复杂的功能,我发现它的可读性较差,难以维护。
我会这样:
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,如果您愿意,可以使用。
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |