C++采用浮点数或双精度的模板函数

C++ template function that takes float or double

本文关键字:函数 双精度 浮点数 C++      更新时间:2023-10-16

我想编写一个适用于doublefloat的模板函数,如下所示:

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

我的问题是4.0 3.0都是双精度字面,因此我在 clang 上收到以下错误:

error: implicit conversion increases floating-point precision: 'const float' to 'double' [-Werror,-Wdouble-promotion]

有没有一种优雅的方法可以编写此代码而无需将上转换转换为双倍?我能想到的最好的,就是这个

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

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

我会这样做:

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

或者用static_cast,如果你喜欢的话。

虽然 HolyBlackCat 的答案是完全可行的,但这是我的两点:

在这种特定情况下,您的常量应该意味着某些东西。它们可能是具有某种含义的幻数。最好的做法是给它们起一个名字,如果你想让它们易于维护。在较新的C++中,它允许它们成为模板

#include <iostream>
namespace sdd // some_dirty_details 
{
/// @brief: Description of the constant
template <class T>
constexpr T some_constant  = static_cast<T>(3.0);
}
int main()
{
std::cout << sdd::some_constant<float> << std::endl;
}