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可能不是解决此问题的理想方法(很难理解)

最佳答案

当您想为更特定的参数类型优化行为时,请使用重载而不是显式的专门化。它更易于使用(惊喜更少),功能更强大

template<typename T>
struct A
{
    A<T> operator%( const T& x) {
      return opModIml(x, std::is_floating_point<T>());
    }

    A<T> opModImpl(T const& x, std::false_type) { /* ... */ }
    A<T> opModImpl(T const& x, std::true_type) { /* ... */ }
};

您似乎很好奇的使用SFINAE(enable_if)的示例
template<typename T>
struct A
{
    A<T> operator%( const T& x) {
      return opModIml(x);
    }

    template<typename U,
             typename = typename
               std::enable_if<!std::is_floating_point<U>::value>::type>
    A<T> opModImpl(U const& x) { /* ... */ }

    template<typename U,
             typename = typename
               std::enable_if<std::is_floating_point<U>::value>::type>
    A<T> opModImpl(U const& x) { /* ... */ }
};

当然更难看。我认为没有理由在这里使用enable_if。太过分了。

09-12 09:32