Как использовать enable_if для взаимоисключающих шаблонов функций, не являющихся членами?

Я пытаюсь написать шаблоны функций-операторов, не являющихся членами, например:

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

Но когда я пытаюсь обработать, когда lи rимеют разную длину:

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

Я получаю ошибки неоднозначности. Я попробовал что-то вроде:

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

, который я прочитал (здесь, в SO), для решения подобных проблем для шаблонов функций-членов. (Иногда респонденты заменяли функцию-член на шаблон функции-члена, чтобы включить это.) Но для меня ошибки не меняются. Должен ли я переключиться на размещение enable_ifв возвращаемом типе?

О, предполагается, что выражение возвращаемого типа исключает этот оператор, когда два типа элементов не могут быть сравнены. Будет ли это работать на самом деле? Совместимо ли это с размещением enable_ifтам же?

6
задан Xeo 5 October 2012 в 18:41
поделиться