Вы можете написать:
template <typename T1, AreEqComparable<T1> T2>
bool are_equal(T1, T2);
Это эквивалентно:
template <typename T1, typename T2>
requires AreEqComparable<T2, T1>
bool are_equal(T1, T2);
Здесь типы переворачиваются в ограничении, AreEqComparable<T2, T1>
вместо AreEqComparable<T1, T2>
. Это, безусловно, будет иметь значение для многих концепций, но, вероятно, не для этого, в частности, поскольку ==
само становится симметричным в C ++ 20 (если не считать патологических случаев, которых не должно быть в реальном коде). И если вы хотите на действительно быть уверенным, что эта симметрия действительна, вы всегда можете сделать ее явной в концепции (так как EqualityComparableWith
в рабочем проекте):
template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
{ a == b } -> bool;
{ b == a } -> bool;
};
<ч />
На самом деле вы можете получить желаемое ограничение в правильном порядке, переключив порядок параметров шаблона (ч / т Матье. M):
template <typename T2, AreEqComparable<T2> T1>
bool are_equal(T1, T2);