специализация метода enable_if

template<typename T>
struct A
{
    A<T> operator%( const T& x);
};

template<typename T>
A<T> A<T>::operator%( const T& x ) { ... }

Как я могу использовать enable_if, чтобы сделать следующую специализацию для любого типа с плавающей запятой (is_floating_point)?

template<>
A<float> A<float>::operator%( const float& x ) { ... }

ИЗМЕНИТЬ: Вот ответ, который я придумал, который отличается от тех, что опубликованы ниже ...

template<typename T>
struct A
{
    T x;

    A( const T& _x ) : x(_x) {}

    template<typename Q>
    typename std::enable_if<std::is_same<Q, T>::value && std::is_floating_point<Q>::value, A<T> >::type operator% ( const Q& right ) const
    {
        return A<T>(fmod(x, right));
    }

    template<typename Q>
    typename std::enable_if<std::is_convertible<Q, T>::value && !std::is_floating_point<Q>::value, A<T> >::type operator% ( const Q& right ) const
    {
        return A<T>(x%right);
    }
};

Как говорится на плакатах ниже, использование enable_if может быть не идеальным для этой проблемы (это очень трудно читать)

11
задан Johannes Schaub - litb 1 October 2011 в 14:53
поделиться