Понятие<Comparable>определяет равенство и неравенство.
Интуитивно<Comparable>объекты должны определять двоичный предикат, названный<equal>, который возвращает, представляют ли оба объекта одно и то же абстрактное значение. Иными словами,<equal>должно проверять на глубокое равенство. Поскольку «представление одной и той же абстрактной ценности» трудно выразить формально, точный смысл равенства частично оставлен для интерпретации программистом со следующими указаниями:
Равенство должно быть совместимо с конструированием копий; копирование, конструирующее значение, дает значениеequal.
Равенство должно быть независимым от представления; объект, представляющий дробь как4/8, должен бытьequalк объекту, представляющему дробь как2/4, поскольку они оба представляют математический объект1/2.
Более того,<equal>должно проявлять свойства, которые делают интуитивно понятным использование для определения эквивалентности объектов, что формализуется законами для<Comparable>.
Minimal complete definition
equal Когдаequalопределено,not_equalреализуется по умолчанию в качестве его дополнения. Для всех объектовx,yметкиComparable,
<equal>должно определятьотношение эквивалентности, и<not_equal>должно быть его дополнением. Другими словами, для всех объектов<a>,<b>,<c>метки<Comparable>верно следующее (где<x == y>и<x != y>обозначают<equal(x, y)>и<not_equal(x, y)>соответственно):
Два типа данных<T>и<U>, которые моделируют концепцию EqualityComparable перекрестного типа, представленную вN3351, автоматически моделируют концепцию<Comparable>, устанавливая
Обратите внимание, что это также делает одинаковыми типы равенства вобычном смыслемодели<Comparable>.
Equality-preserving functions
Пусть<A>и<B>будут двумя<Comparable>бирками. Функция \(f: A \to B\) называется равносохраняющей, если она сохраняет структуру<Comparable>понятия, которое можно строго изложить следующим образом. Для всех объектов<x>,<y>метки<A>,
Мы просто требуем, чтобы<f>была функция в обычном математическом смысле. Другим свойством являетсяинъекционность, которую можно рассматривать как отображение без потерь. Это свойство можно определить как
Это эквивалентно утверждению, что<f>отображает отдельные элементы в отдельные элементы, отсюда и аналогия «без потерь». Другими словами,<f>не будет сжимать отдельные элементы из своего домена в один элемент в своем изображении, тем самым теряя информацию.
Эти функции очень важны, особенно функции сохранения равенства, потому что они позволяют нам рассуждать просто о программах. Также отметим, что в математике свойство сохранения равенства считается само собой разумеющимся, поскольку оно является частью определения функции. Мы считаем, что здесь важно провести различие, потому что программирование развивалось по-разному и в результате программисты привыкли работать с функциями, которые не сохраняют равенство.
Cross-type version of the methods
Методы<equal>и<not_equal>«перегружены» для обработки отдельных тегов с определенными свойствами. В частности, они определены дляразличныхтегов<A>и<B>, так что
AиBимеют общую меткуC, определяемую метафункциейcommon.
A,BиC- всеComparable, если принимать индивидуально
\(\mathtt{to} : A \to C \) и \(\mathtt{to} : B \to C\) являются как сохраняющими равенство, так и инъекционными (т.е. они являются встраиванием), как определено метафункциейis_embedding.
Определения метода для тегов, удовлетворяющих вышеуказанным свойствам, являются
В контексте программирования с разнородными значениями полезно сравнивать несвязанные объекты<false>вместо того, чтобы вызывать ошибку. По этой причине<equal>принимает специальное поведение для несвязанных объектов меток<T>и<U>, не удовлетворяющих вышеуказанным требованиям к перегрузкам поперечного типа. В частности, когда<T>и<U>не связаны (т.е.<T>не могут быть преобразованы в<U>и наоборот), сравнение объектов с этими тегами дает ложное значение времени компиляции. Это приводит к тому, что несвязанные объекты, такие как<float>и<std::string>, будут сравнивать ложные, в то время как сравнение связанных объектов, которые не могут быть безопасно встроены в одну и ту же сверхструктуру (например,<long long>и<float>из-за потери точности), вызовет утверждение времени компиляции. Также обратите внимание, что для любого тега<T>, для которого не предусмотрено минимальное полное определение<Comparable>, также будет запущено утверждение времени компиляции, потому что<T>и<T>тривиально разделяют общий тег<T>, который является ожидаемым поведением. Этот выбор дизайна направлен на обеспечение большей гибкости для сравнения объектов, в то же время отвергая шаблоны использования, которые, скорее всего, являются ошибками программирования.
Returns a function performing equal after applying a transformation to both arguments.comparing creates an equivalence relation based on the result of applying a function to some objects, which is especially useful in conjunction with algorithms that accept a custom predicate that must represent an equivalence relation. More...
Returns a Logical representing whether x is equal to y.The equal function can be called in two different ways. First, it can be called like a normal function: More...
Returns a Logical representing whether x is not equal to y.The not_equal function can be called in two different ways. First, it can be called like a normal function: More...
Returns a Logical representing whether x is equal to y.The equal function can be called in two differ...
Definition: equal.hpp:64
Возвращает функцию, выполняющуюся<equal>после применения преобразования к обоим аргументам.<comparing>создает отношение эквивалентности, основанное на результате применения функции к некоторым объектам, что особенно полезно в сочетании с алгоритмами, которые принимают пользовательский предикат, который должен представлять отношение эквивалентности.
Возвращает<Logical>, представляя, равна ли<x><y>. Функция<equal>может быть названа двумя различными способами. Во-первых, его можно назвать нормальной функцией:
Иными словами,<equal.to(x)>является функциональным объектом, эквивалентным<partial(equal, x)>. Это обеспечивается для повышения читаемости некоторых конструкций, особенно при использовании алгоритмов более высокого порядка.
Signature
При наличии Логического<Bool>и двух Сравнительных<A>и<B>, которые разделяют общее встраивание, подпись \(\mathtt{equal} : A \times B \to Bool \
Parameters
x,y
Два объекта для сравнения равенства.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Вопрос в том, следует ли<equal>принять более 2 аргументов и иметь семантику, соответствующую семантике Python<==>. В настоящее время это не поддерживается по следующим причинам:
Он был реализован в MPL11, но пока не показал себя полезным.
Дляnot_equalне имеет смысла иметь аритмию более 2, толькоequalможет иметь ту семантику, которая нарушала бы симметрию.
<Logical>, что означает, что<x>не равен<y>.<not_equal>функция может быть названа двумя различными способами. Во-первых, его можно назвать нормальной функцией:
Иными словами,<not_equal.to(x)>является функциональным объектом, эквивалентным<partial(not_equal, x)>. Это обеспечивается для повышения читаемости некоторых конструкций, особенно при использовании алгоритмов более высокого порядка.
Signature
При наличии Логического<Bool>и двух Сравнительных<A>и<B>, которые имеют общее вложение, подпись \(\mathtt{not\_equal} : A \times B \to Bool \
Parameters
x,y
Два объекта для сравнения неравенства.
Example
// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
Статья Boost.Hana: Comparable раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.