浮点类型的模板函数中的文字

时间:2014-12-11 22:53:19

标签: c++ c++11 c++14

之前已经出现过这个问题,特别是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)”或其他可怕的东西!

2 个答案:

答案 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 );
}

Live demo

答案 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结构中定义和专门化常量。

你可能不再需要静态断言了。您甚至可以将函数扩展到其他代数(矢量积,矩阵,四元数等)。

但是,它并不符合您的简洁要求。