che sto cercando di scrivere terzi modelli funzione operatore come:Come si usa enable_if per i modelli di funzione non membri mutuamente esclusivi?
#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>())
{ /*...*/ }
Ma quando provo a gestire quando l
e r
hanno lunghezze diverse:
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>())
{ /*...*/ }
ricevo errori ambiguità. Ho provato qualcosa del tipo:
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>())
{ /*...*/ }
che ho letto (qui su S.O.) per risolvere problemi come questo per i modelli di funzioni membro. (A volte, i rispondenti hanno cambiato una funzione membro in un modello funzione membro per abilitarlo.) Ma gli errori non cambiano per me. Devo passare a inserire enable_if
nel tipo restituito?
Oh, l'espressione del tipo restituito dovrebbe escludere questo operatore quando i due tipi di elementi non possono essere confrontati. Funzionerà davvero? È compatibile con l'installazione di enable_if
?
Che cos'è esattamente l'errore di ambiguità? –