Оператор трехстороннего сравнения по умолчанию в рекурсивных структурах данныхC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оператор трехстороннего сравнения по умолчанию в рекурсивных структурах данных

Сообщение Anonymous »

Я хотел бы использовать оператор трехстороннего сравнения по умолчанию в рекурсивной структуре данных, например:

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

struct MyStruct {
int i;
std::vector v;
std::partial_ordering operator(const MyStruct &a) const = default;
};

// Fails: can't infer comparison result type
static_assert(std::same_as);
К сожалению, похоже, существует циклическая зависимость, поскольку оператор по умолчанию зависит от категорий сравнения целых чисел и std::vector, а векторного сравнения Категория зависит от категории сравнения, если ее value_type, а именно MyStruct. Тот факт, что я явно объявил тип сравнения как std::partial_ordering, похоже, не помогает, хотя и должен. В частности, это работает, если я реализую функцию вручную:

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

struct MyStruct {
int i;
std::vector v;
std::partial_ordering operator(const MyStruct &other) const {
if (auto r = i  other.i; r != 0)
return r;
return v  other.v;
}
};

// OK
static_assert(std::same_as);
Мои вопросы:

[*]Есть ли способ решить эту проблему? Спецификация запрещает перегрузку std::compare_three_way_result, но есть ли другой способ повлиять на вектор или std::lexicographical_compare_three_way?

[*]Есть ли способ, используя концепции или предложения, обнаружить неполный тип? В качестве альтернативы я мог бы создать свой собственный векторный класс-контейнер, который по умолчанию использует std::partial_ordering, когда тип неполный.



Подробнее здесь: https://stackoverflow.com/questions/788 ... structures
Ответить

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

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

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

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

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