Я продолжал писать операторы сравнения старой школы даже после того, как среды, в которых я работаю, начали поддерживать C++20. Я хочу перейти к написанию операторов трехстороннего сравнения. Написание одного оператора вместо пяти не только более эффективно, но и гораздо более элегантно.
Проблема:
На данный момент я, к сожалению, не до конца понимаю концепцию трехстороннего оператора. Я думал, что упорядочение — это способ расставить приоритеты свойств класса и порядок их сравнения, но, похоже, это нечто большее. Кроме того, я не понимаю, почему в STL есть три типа упорядочения: std::strong_ordering, std::weak_ordering или std::partial_ordering.
Вопрос:
Ниже приведен интерфейс класса, который я сейчас пишу. Этот класс является законным, так как в конечном итоге он будет запущен в производство. Используя предоставленный класс в качестве примера, можете ли вы продемонстрировать, как написать оператор трехстороннего сравнения? Не могли бы вы указать, какой порядок вы использовали и почему вы использовали именно этот порядок?
ПРИМЕЧАНИЯ:
1. Объект Position должен быть больше, если его свойство row больше, чем у другого объекта Position. Если значения строк объекта Position равны, то наибольшим является строка с большим значением столбца. Если значения строки и столбца равны, то обе позиции одинаковы (или равны).2. Строка объектов координаты и столбец относятся к классу, который содержит внутренний числовой тип. С ними можно обращаться так, как если бы они были простым числом size_t или типом uintmax_t.
#pragma once
#ifndef POSITION_HPP
#define POSITION_HPP
#include
#include
#include
#include
#include
#include
namespace Text {
class Position
{
Coordinate row; /// @private
Coordinate col; /// @private
public:
Position();
Position(size_t rowNum);
Position(size_t rowNum, size_t colNum);
Position(Position &) noexcept = default; /// Copy Ctor
Position(Position &&) noexcept = default; /// Move Ctors
Position &operator = (const Position &) = default; /// Copy Assignment Ops
Position &operator = (Position &&) noexcept = default; /// Move Assignment Op
Coordinates getCoordinates() noexcept;
Coordinate getRow() noexcept;
Coordinate getCol() noexcept;
void setPosition(size_t rowNum, size_t colNum);
void setRow(size_t rowNum);
void setCol(size_t colNum);
Position &operator ++ () noexcept;
Position &operator ++ (int) noexcept;
Position &operator -- () noexcept;
Position &operator -- (int) noexcept;
friend bool operator == (const Position &lhs, const Position &rhs) noexcept;
friend std::strong_ordering operator (const Position &lhs, const Position &rhs)
noexcept;
};
};
#endif
Подробнее здесь: https://stackoverflow.com/questions/798 ... ue-is-cont
Мобильная версия