代码之家  ›  专栏  ›  技术社区  ›  davetapley

对整数类型而不是小数类型执行舍入

  •  1
  • davetapley  · 技术社区  · 14 年前

    在下面的函数中,我正在寻找一个表达式来替换 isIntegral<T> .

    其目的是 T 是我们加上的积分型 0.5f 之前 static_cast 隐式地设置值的下限(因此我们获得一个四舍五入的值),但是 T型 是一个分数类型,我们什么也不加,所以 静态铸造 只能降低精度。

    T interpolate( T const & prev, T const & next, float interpolation )
    {
        float prevFloat = static_cast< float >( prev );
        float nextFloat = static_cast< float >( next );
    
        float result = prevFloat + ( (nextFloat-prevFloat) * interpolation );
    
        return static_cast< T >( result + ( isIntegral<T> ? 0.5f : 0.0f );
    }
    
    4 回复  |  直到 14 年前
        1
  •  9
  •   Oliver Charlesworth    14 年前

    使用 std::numeric_limits<T>::is_integer (它在 <limits> 标题)。

        2
  •  2
  •   Ben Jackson    14 年前

    为什么不直接申报 const float addend = 0.5f - static_cast<T>(0.5f)

        3
  •  0
  •   Benjamin Lindley    14 年前
    std::is_integral<T>::value
    

    如果你包括 <type_traits> ,大多数编译器现在都支持此功能。

        4
  •  0
  •   Philipp    14 年前

    这应该是可能的(没有任何运行时开销)与一些Boost魔术(未测试):

    #include <boost/type_traits/is_integral.hpp>
    #include <boost/utility/enable_if.hpp>
    template<typename T>
    typename boost::enable_if<boost::is_integral<T>, T>::type
    interpolate(const T& prev, const T& next, float interpolation) {
        // code for the case that T is an integral type
    }
    template<typename T>
    typename boost::disable_if<boost::is_integral<T>, T>::type
    interpolate(const T& prev, const T& next, float interpolation) {
        // code for the case that T is not an integral type
    }