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

模板函数roundto int,float->truncation

  •  3
  • OlimilOops  · 技术社区  · 14 年前

    根据这个问题: Calling template function without <>; type inference 我将来要使用的圆形函数如下:

    template < typename TOut, typename TIn >
    TOut roundTo( TIn value ) {
       return static_cast<TOut>( value + 0.5 );
    }
       double d = 1.54;
       int i = rountTo<int>(d);
    

    但是,只有当它被用于将char、short、int、long、long long int等整型数据类型取整,并且是无符号的对应数据类型时,它才有意义。 如果它将被用来兜售作为浮动或长倍,它将提供s**。

    double d = 1.54;
    float f = roundTo<float>(d);
    // aarrrgh now float is 2.04;
    

    我在想一个特定的函数过载,但是…
    那是不可能的…
    你将如何解决这个问题?
    提前多谢
    哎呀

    3 回复  |  直到 14 年前
        1
  •  1
  •   Alex Martelli    14 年前

    假设需要最接近的整数值,则强制转换为 TOut ,

    static_cast<TOut>( static_cast<long long>(value + 0.5) );
    

    floor 也可以作为内部铸件的替代品。关键是不要依赖对未知类型的强制转换来执行任何截断——使用 地板 或A cast 对于一个著名的积分类型, 然后 执行返回指定类型所需的进一步强制转换。

        2
  •  0
  •   Kirill V. Lyadvinsky    14 年前

    您可以禁用非整型返回类型的函数:

    #include <boost/type_traits.hpp>
    #include <boost/utility.hpp>
    
    template < typename TOut, typename TIn >
    typename boost::enable_if<boost::is_integral<TOut>, TOut>::type roundTo( TIn value ) {
       return static_cast<TOut>( value + 0.5 );
    }
    
        3
  •  0
  •   Stephen    14 年前

    尝试使用地板:

    template < typename TOut, typename TIn >
    TOut roundTo( TIn value ) {
       return static_cast<TOut>(floor( value + 0.5 ));
    }
    
    double d = 1.54;
    int i = rountTo<int>(d);
    double d = 1.54;
    float f = roundTo<float>(d);