On 14/01/16 20:46 +0000, Jonathan Wakely wrote:
On 14/01/16 20:43 +0000, Jonathan Wakely wrote:
On 14/01/16 21:22 +0100, Daniel Krügler wrote:
If there were an __is_direct_base_of intrinsic (or is there?), it
seems to me that there would be no need for all these specializations
(each one nearly taking as much space as the explicit inline
definition of operator!) and there could be a single constrained
operator!= that would only trigger for types that are direct base
classes of __tag.
Yes. In fact we do have a __direct_bases intrinsic, see
<tr2/type_traits>. We'd need a bit of metaprogramming to see if
the__tag is one of __direct_bases(_Tp)... but that's doable.
Bah, this causes an ICE:
template<typename _Tp,
typename = __or_<is_same<__tag, __direct_bases(_Tp)>...>>
inline bool
operator!=(const _Tp& __lhs, const _Tp& __rhs) noexcept
{ return !(__lhs == __rhs); }
But this doesn't ICE:
template<typename _Tp, typename... _Types>
struct __is_one_of : __or_<is_same<_Tp, _Types>...>
{ };
// Derive from this tag to define l != r as !(l == r).
struct __tag { };
/// Compare the parameters of two random number distributions.
template<typename _Tp,
typename = __is_one_of<__tag, __direct_bases(_Tp)...>>
inline bool
operator!=(const _Tp& __lhs, const _Tp& __rhs) noexcept
{ return !(__lhs == __rhs); }