私は次のような非メンバー演算子関数テンプレートを書き込もうとしています:
#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
リターンタイプに切り替える必要がありますか?
ああ、2つの要素タイプを比較できない場合、戻り型式はこの演算子を除外することになっています。それは実際に機能しますか?enable_if
あちこちに置くのも互換性がありますか?