我有一个函数可以简化成这样:
template<class T>
T foo(T x)
{
return 123.45 / x;
}
我想确保数字文字 123.45 与 x 的类型相同。假设 T 可以是任何数字类型:signed/unsigned char 到 long-long 或 float 到 long-double。
指示 123.45 应为 T 类型的最现代方法是什么?
我的要求
- 不应发出警告(每个警告都打开)。
- 我希望小数 123.45 在计算时具有 T 的精度。
- 我想要实现这些目标的最优雅的解决方案。
正在考虑的问题
- “旧式类型转换”,即
(T)123.45
在 C++ 中基本上已弃用。 -
static_cast<T>(123.45)
似乎是正确的 Actor 类型。但是,它很冗长,我从未见过它用在文字上。 - 我不确定在 T 为
123.45L
的情况下是否需要后缀(例如long double
)以获得最大精度,或者如果编译器将自动使用最高精度的十进制到二进制转换。
2014 年 5 月 7 日更新
将我的代码库中的数百个转换更改为 T(123.45)
形式后,我发现有时这种语法不可用。例如,你不能做 long double(123.45)
因为 C++ 不支持多 token 类型构造函数。在这些情况下,我选择了 static_cast<long double>(123.45)
.
最佳答案
简单的怎么样
template<class T>
T foo(T x)
{
return T(123.45) / x;
}
这将允许自定义数字类接受构造函数中的值。
关于c++ - 表达模板化数字文字的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22380778/