Я определяю строго типизированный целочисленный тип, играя с концепциями 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