std :: equality_comparable_with,std :: totally_ordered_with和强类型整数

问题描述 投票:2回答:1

我在使用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存在,因此我无法在期望它们的参数彼此为std::totally_ordered_with的API中一起使用std::totally_ordered_with<T,U>std::common_reference_t<T,U>。这不适用于strong_intint,因为它们之间的转换是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
}

是否可以保留both以下内容?

  • strong_intint之间的转换是explicit

  • 在希望strong_int siint i满足si的上下文中使用istd::totally_ordered_with

  • 我在使用C ++ 20概念时定义了一个强类型整数类型,如下所示。 class strong_int {public:using integer_type = int;明确的strong_int(integer_type)...

c++ c++20 strong-typing c++-concepts
1个回答
0
投票

std::common_reference很大程度上基于std::common_type。与大多数类型特征不同,您可以提供std::common_type under certain circumstances的专业化:

[尽管有[meta.type.synop]的规定,并根据[namespace.std],程序可以将common_­type<T1, T2>T1类型专门化为T2,使得is_­same_v<T1, decay_­t<T1>>is_­same_­v<T2, decay_­t<T2>>分别为真正。 [注意:当仅需要在模板参数之间进行显式转换时,需要这种专业化。

© www.soinside.com 2019 - 2024. All rights reserved.