Como usar um enable_if para modelos de função não membros mutuamente exclusivos?

Eu estou tentando escrever modelos de função de operador não membro como:

#include <utility>

template < typename T, unsigned L >
class MyType;

template < typename T, typename U, unsigned L >
auto  operator ==( MyType<T,L> const &l, MyType<U,L> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

Mas quando tento lidar quandol er tem diferentes comprimentos:

template < typename T, unsigned Lt, typename U, unsigned Lu, class Enable = typename std::enable_if<(Lt < Lu)>::type >
auto  operator ==( MyType<T,Lt> const &l, MyType<U,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

template < typename T, unsigned Lt, typename U, unsigned Lu, class Enable = typename std::enable_if<(Lt > Lu)>::type >
auto  operator ==( MyType<T,Lt> const &l, MyType<U,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

Eu recebo erros de ambigüidade. Eu tentei algo como:

template < typename T, unsigned Lt, typename U, unsigned Lu, bool B = (Lt < Lu), class Enable = typename std::enable_if<B>::type >
auto  operator ==( MyType<T,Lt> const &l, MyType<U,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

template < typename T, unsigned Lt, typename U, unsigned Lu, bool B = (Lt > Lu), class Enable = typename std::enable_if<B>::type >
auto  operator ==( MyType<T,Lt> const &l, MyType<U,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

que eu li (aqui em S.O.) para resolver problemas como este para modelos de função de membro. (Às vezes, os respondentes alteraram uma função de membro para um modelo de função de membro para habilitar isso.) Mas os erros não mudam para mim. Eu tenho que mudar para colocarenable_if no tipo de retorno?

Oh, a expressão do tipo de retorno deve excluir esse operador quando os dois tipos de elemento não podem ser comparados. Realmente funcionará? É compatível com a colocação doenable_if por lá também?

questionAnswers(1)

yourAnswerToTheQuestion