Как автоматически сгенерировать оператор == с помощью boost / operator.hpp? - PullRequest
1 голос
/ 07 октября 2019

Следуйте этому, поскольку я задаю немного другой вопрос: В чем разница между использованием boost :: равенства_компараблей и переопределенного оператора bool ==?

Вот моя попыткаделать это код.

#include <boost/operators.hpp>

enum class AnEnum : uint64_t;

struct Base : boost::equality_comparable<Base, Base> {
    std::shared_ptr<AnEnum > units;

    std::shared_ptr<int> value;

    bool operator ==(Base const& rhs) { 
        return (*value == *rhs.value)
            && (*units == *rhs.units); 
    }

    friend bool operator == (const Base & lhs, const Base & rhs) {
        return (*lhs.value == *rhs.value)
            && (*lhs.units == *rhs.units);
    };
};

Я надеялся, что Boost автоматически реализует оператор ==, но компилятор пожаловался на отсутствующую ошибку реализации. Как автоматически реализовать следующую функцию:

bool operator == (const Base & lhs, const Base & rhs);

Я использую это как справку: https://www.boost.org/doc/libs/1_71_0/libs/utility/operators.htm#arithmetic

РЕДАКТИРОВАТЬ:

Какя могу получить оператор == для автоматического определения, согласно следующему:

#include <boost/operators.hpp>

enum class AnEnum : uint64_t;

struct Base : boost::equality_comparable<Base, Base> {
    std::shared_ptr<AnEnum > units;

    std::shared_ptr<int> value;

    friend bool operator == (const Base & lhs, const Base & rhs);
};

1 Ответ

1 голос
/ 07 октября 2019

boost::equality_comparable<T> ожидает, что T предоставит operator==, и предоставит operator!= на основании этого. Он не каким-то волшебным образом умеет сравнивать произвольные классы. Это прямо там в ссылке, которую вы цитируете - обратите внимание на то, что находится в столбце «Требования» и в столбце «Поставляемые операции».

boost::equality_comparable<Base, Base> отчасти бессмысленно. Двухпараметрическая форма equality_comparable предназначена для синтеза разнородных сравнений между объектами разных типов.

...