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?