std :: equal_comparable_with, std :: totally_ordered_with и строго типизированные целые числа - PullRequest
3 голосов
/ 11 апреля 2020

Я определяю строго типизированный целочисленный тип, играя с концепциями C ++ 20, как показано ниже.

class strong_int {
public:
    using integral_type = int;

    explicit strong_int( integral_type ) noexcept;

    explicit operator integral_type() const noexcept;

    constexpr auto operator<=>( const strong_int& ) const noexcept;

private:
    integral_type m_value;
};

constexpr auto operator<=>( const strong_int&, const int& ) noexcept;
constexpr auto operator<=>( const int&, const strong_int& ) noexcept;

Однако я не могу использовать strong_int и int вместе в API ожидая, что их параметры будут std::totally_ordered_with друг для друга, потому что std::totally_ordered_with<T,U> ожидает, что std::common_reference_t<T,U> существует. Это не относится к strong_int и int, поскольку преобразования между ними explicit. Например, следующее не удается:

template<typename T1, typename T2>
    requires std::totally_ordered_with<T1,T2>
void fn0( const T1&, const T2& );

void fn1() {
    strong_int si{0};
    int        i;

    fn0( si, i ); // compile error here
}

Есть ли способ сохранить оба следующие?

  • преобразований между strong_int и int являются explicit

  • используйте strong_int si и int i в контекстах, которые хотят si и i для удовлетворения std::totally_ordered_with

...