之前已经出现过这个问题,特别是Should we generally use float literals for floats instead of the simpler double literals?,但我想知道现在是否有更好的建议解决方案我们在C ++ 14版本中存在用户定义的文字和大括号初始化之类的东西。< / p>
问题可以表示为如何在浮点类型的模板函数中编写浮动文字
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)”或其他可怕的东西!
答案 0 :(得分:2)
特定于C ++ 14的选项是使用variable template
namespace detail
{
template<typename F>
F multiplier = F(101.0);
}
template <typename T> T foo( T x )
{
static_assert( std::is_floating_point<T>::value, "" );
T y = x * detail::multiplier<T>;
static_assert(std::is_same<decltype(detail::multiplier<T>), T>{}, "");
return( y );
}
答案 1 :(得分:1)
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 );
}
然后只需在foo_constants
结构中定义和专门化常量。
你可能不再需要静态断言了。您甚至可以将函数扩展到其他代数(矢量积,矩阵,四元数等)。
但是,它并不符合您的简洁要求。