C++采用浮点数或双精度的模板函数
C++ template function that takes float or double
我想编写一个适用于double
和float
的模板函数,如下所示:
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;
}
相关文章:
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 为什么我的数组双精度函数不起作用?
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 从 C++ 中的函数返回双精度的问题
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 函数重载和双精度和长之间的混淆
- C++采用浮点数或双精度的模板函数
- 对需要双精度数组和结构作为输入C++ DLL 函数的 C# 调用
- 带有映射的 Lambda 函数,其中键是元组,值是双精度
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 函数双精度,整数如何工作?C++
- 这是为浮点数/双精度函数泛型的正确方法吗?
- 双精度/整数模板函数的向量
- 函数重载如何处理双精度和浮点
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>