Distinguishing integer from floating point types in a template

前端 未结 3 1115
逝去的感伤
逝去的感伤 2021-02-09 13:27

I\'d like to perform similar, but not identical computations for several integer types (16, 32, 64 bits) and floating point types (float, double, long double). Most of the code

相关标签:
3条回答
  • 2021-02-09 13:52

    You can specialize on <type_traits>

    Then you can group functions based on categories

    template<typename T, bool INTEGRAL> class isEqualbyType;
    
    template<typename T>
    class isEqualbyType<T, true>
    {
    public:
        static bool cmp( T a, T b ) { 
            return a == b; }
    };
    
    template<typename T>
    class isEqualbyType<T, false>
    {
    public:
    
        static bool cmp( T a, T b ) {
            static const double epsilon=1e-50;
            return abs( a - b ) < epsilon; }
    };
    
    template<typename T>
    bool isEqual( T a, T b )
    {
       return isEqualbyType<T, std::is_integral<T>::value>::cmp(a,b);
    };
    
    0 讨论(0)
  • 2021-02-09 13:55

    With C++11 it is possible to use type traits. See std::enable_if documentation In your case, it might look like this:

    Function parameter specialization:

    template<class T>
    bool isEqual(T a, T b, typename std::enable_if<std::is_integral<T>::value >::type* = 0) 
    {
        return a == b;
    }
    
    template<class T>
    bool isEqual(T a, T b, typename std::enable_if<std::is_floating_point<T>::value >::type* = 0) 
    {
        return abs( a - b ) < epsilon;
    }
    

    Return type specialization:

    template<class T>
    typename std::enable_if<std::is_integral<T>::value, bool >::type isEqual(T a, T b)
    
    {
        return a == b;
    }
    
    template<class T>
    typename std::enable_if<std::is_floating_point<T>::value, bool >::type isEqual(T a, T b)
    {
        return abs( a - b ) < epsilon;
    }
    
    0 讨论(0)
  • 2021-02-09 14:08

    Yes, you can use SFINAE in combination with the metafunctions from <type_traits>

    #include<type_traits>
    
    template<class IntegralType>
    typename std::enable_if<
        std::is_integral<IntegralType>::value,
        bool>::type
    
    isEqual(IntegralType a,IntegralType b)
    {
        return a == b;
    }
    
    template<class FloatingType>
    typename std::enable_if<
        std::is_floating_point<FloatingType>::value,
        bool>::type
    
    isEqual(FloatingType a,FloatingType b)
    {
        return fabs(a-b) <  std::numeric_limits<FloatingType>::epsilon();
    }
    
    0 讨论(0)
提交回复
热议问题