Здравствуйте, Marty, Вы писали:
M>Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?
Можно:
https://en.cppreference.com/w/cpp/language/default_comparisons
Здравствуйте, Marty, Вы писали:
M> Здравствуйте!
M>Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?
В C++20 сказать компилятору, чтобы он сгенерировал
spaceship operator:
struct A
{
int a;
std::string b;
auto operator<=>(A const&) const = default;
};
bool r = A{ 2, "b" } > A{ 1, "a" };
В С++[11..17] есть
namespace std::rel_ops которому нужны operator< и operator==:
struct B
{
int x;
std::string y;
bool operator==(B const& b) const { return std::tie(x, y) == std::tie(b.x, b.y); }
bool operator< (B const& b) const { return std::tie(x, y) < std::tie(b.x, b.y); }
};
using namespace std::rel_ops;
bool r = B{ 2, "b" } > B{ 1, "a" };
В Boost
operators есть `totally_ordered`
Ну а любителям С++98, для кого раньше было лучше, придется немного потрудиться, выписывая 12 перегрузок этих операторов вручную.
Здравствуйте, Marty, Вы писали:
M> Здравствуйте!
M>Есть у меня структура. Сделал я для неё метод (можно и свободную функцию) compare, которая возвращает int. Можно как-то сформировать операторы всей пачкой на базе этого метода? Ну, <, <=, >, >=, ==, !=, чтобы ручками не выписывать?
В С++20 использовать operator <=>.
А до него можно использовать шаблонную магию, как у меня
здесь .
class C : public CmpComparable<C> // provides all comparison operators for class C
{
public:
// cmp objects
CmpResult objCmp(const C &obj) const { .... }
};
Здравствуйте, Шахтер, Вы писали:
Ш>В С++20 использовать operator <=>.
Ш>А до него можно использовать шаблонную магию, как у меня здесь .
Ну, я что-то такое предполагал, но думал, что есть стандартное