================
@@ -18,8 +18,11 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-template <class _Pred, class _Lhs, class _Rhs>
-struct __is_trivial_plus_operation : false_type {};
+template <class _Operation, class _Canonical>
----------------
ldionne wrote:

I think what we want is something like this:

```
struct __equal_tag {};
struct __plus_tag {};
// etc...

template <class _CanonicalTag, class _Operation, class ..._Args>
struct __desugars_to : false_type {};


// std::equal_to and friends
template <class _Tp> struct __desugars_to<__equal_tag, equal_to<_Tp>, _Tp, _Tp> 
: true_type {};
template <class _Tp, class _Up> struct __desugars_to<__equal_tag, 
equal_to<void>, _Tp, _Up> : true_type {};
template <class _Tp, class _Up> struct __desugars_to<__equal_tag, __equal, _Tp, 
_Up> : true_type {};
template <class _Tp, class _Up> struct __desugars_to<__equal_tag, 
ranges::equal_to, _Tp, _Up> : true_type {};

// std::plus and friends
etc...
```

I originally thought that using `std::equal_to<>` as a "tag" to represent the 
canonical operation was a good idea, but since it doesn't exist in older 
standards we end up having to use `std::equal_to<void>` explicitly, and that 
really obfuscates the fact that it's meant to be a tag.

https://github.com/llvm/llvm-project/pull/68642
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to