【发布时间】:2014-12-12 07:44:34
【问题描述】:
这个问题之前已经出现过,特别是在这里Should we generally use float literals for floats instead of the simpler double literals?,但我想知道现在我们在 C++14 领域是否有更好的建议解决方案,并且存在诸如用户定义的文字和大括号初始化之类的东西。
问题可以表述为如何在浮点类型的模板函数中写一个浮点字面量
template <typename T> T foo( T x )
{
static_assert( std::is_floating_point<T>::value, "" );
T y = x * 101.0;
return( y );
}
所以问题归结为我们如何写“101.0”,因为它是一个双倍,所以如果我调用 foo 会发生什么
float a = 42.0f;
float b = foo( a );
如果我在 foo 中写“101.0f”,如果我用双精度调用 foo 会发生什么,请注意 101.0 和 101.0f 不一定相同。
另外我如何保证不会产生额外的代码来转换值?
其他建议包括编写诸如“static_cast(101.0)”、“T(101.0)”之类的东西或其他可怕的东西!
【问题讨论】:
-
[conv.fpprom]: "
float类型的纯右值可以转换为 double 类型的纯右值。该值不变。这种转换称为 浮点提升。” -
static_cast<T>(100.0)怎么样? -
Littering static_cast
虽然当函数具有合理数量的文字时代码变得非常丑陋。我希望有更简洁的东西! -
请注意,在包含多个变量和文字的较长表达式中,如果 T 为双精度,我不确定所有浮点文字在编译时都会转换为双精度(我有一个测试用例表明情况并非如此至少在 VS 2013 上)