这个问题之前已经出现过,特别是这里我们通常应该对浮点数使用浮点字面量而不是更简单的双字面量吗?但我想知道现在我们在 C++14 领域是否有更好的建议解决方案,并且存在用户定义的文字和括号初始化之类的东西。
该问题可以表示为如何在浮点类型的模板函数中编写浮点文字
template <typename T> T foo( T x )
{
static_assert( std::is_floating_point<T>::value, "" );
T y = x * 101.0;
return( y );
}
Run Code Online (Sandbox Code Playgroud)
所以问题归结为我们如何编写“101.0”,因为它是一个双倍所以如果我使用 foo 调用会发生什么
float a = 42.0f;
float b = foo( a );
Run Code Online (Sandbox Code Playgroud)
如果我在 foo 中写入“101.0f”,如果我用双精度调用 foo 会发生什么,注意 101.0 和 101.0f 不一定相同。
另外我如何保证不会产生额外的代码来转换值?
其他建议包括编写诸如“static_cast(101.0)”、“T(101.0)”之类的东西或其他可怕的东西!
template <typename T> T foo( T x ){
static_assert( std::is_floating_point<T>::value, "" );
T y = x * foo_constants<T>::one_o_one;
return( y );
}
Run Code Online (Sandbox Code Playgroud)
然后只需在结构中定义并专门化常量即可foo_constants。
您可能甚至不再需要静态断言。您甚至可以将函数扩展到其他代数(矢量积、矩阵、四元数等)。
但是,它不符合您的简洁要求。