================
@@ -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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits