Wie verwendet man enable_if für sich gegenseitig ausschließende Nicht-Member-Funktionsvorlagen?

Ich versuche, Vorlagen für Operatorfunktionen zu schreiben, die keine Mitglieder sind, wie:

#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>() )
{ /*...*/ }

Aber wenn ich versuche damit umzugehen, wannl undr unterschiedliche Längen haben:

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>() )
{ /*...*/ }

Ich bekomme Mehrdeutigkeitsfehler. Ich habe versucht, etwas wie:

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>() )
{ /*...*/ }

was ich gelesen habe (hier auf S.O.), um Probleme wie diese für Member-Funktionsvorlagen zu lösen. (Manchmal haben die Befragten eine Mitgliedsfunktion in eine Mitgliedsfunktionsvorlage geändert, um dies zu ermöglichen.) Aber die Fehler ändern sich für mich nicht. Muss ich auf Putten umsteigen?enable_if in den Rückgabetyp?

Oh, der Rückgabetyp-Ausdruck soll diesen Operator ausschließen, wenn die beiden Elementtypen nicht verglichen werden können. Wird es tatsächlich funktionieren? Ist es kompatibel mit dem Setzen derenable_if auch da?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage