Требует ли std :: strong_ordering в C ++ 20 общий заказ?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Требует ли std :: strong_ordering в C ++ 20 общий заказ?

Сообщение Anonymous »

Я внедряю трехстороннее сравнение (оператор ) для класса Enum, представляющего рок-штрафы. Моя реализация компилирует и возвращает std :: strong_ordering , но я не уверен, соответствует ли она формальным требованиям для std :: strong_ordering , особенно в отношении транзитивности.
здесь мой код: < /p>

Код: Выделить всё

#include 

enum class Hand { Rock, Paper, Scissors };

std::strong_ordering operator(Hand a, Hand b) {
if (a == Hand::Paper && b == Hand::Scissors) return std::strong_ordering::less;
if (a == Hand::Scissors && b == Hand::Rock) return std::strong_ordering::less;
if (a == Hand::Rock && b == Hand::Paper) return std::strong_ordering::less;
if (a == b) return std::strong_ordering::equal;
return std::strong_ordering::greater;
}
< /code>
Эта реализация вводит циклическое сравнение: < /p>
[list]
[*] Paper < Scissors
[*]

Код: Выделить всё

Scissors < Rock


[*]

Код: Выделить всё

Paper > Rock
, нарушение транзитивности.

[/list]
Я использовал std :: strong_ordering в качестве типа возврата, Поскольку любые два значения типа enum class hand сравниваются, а все равные значения этого типа одинаковы. Вы можете увидеть, что этот код может быть скомпилирован, и хорошо работает над оценкой победителя игры. Конечно, я не могу поместить серию значений этого класса Enum в какую -то функцию или

Код: Выделить всё

std::set
и т. Д., Который вводит неопределенное поведение. Примечание, в котором говорится, что « type strong_ordering соответствует термину общего упорядочения по математике. что std :: strong_ordering всегда должен представлять общий порядок, в частности, требование транзитивности. Является ли примечание просто неформальным объяснением?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... otal-order
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»