我在使用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_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
}
是否可以保留both以下内容?
strong_int
和int
之间的转换是explicit
在希望strong_int si
和int i
满足si
的上下文中使用i
和std::totally_ordered_with
我在使用C ++ 20概念时定义了一个强类型整数类型,如下所示。 class strong_int {public:using integer_type = int;明确的strong_int(integer_type)...
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>>
分别为真正。 [注意:当仅需要在模板参数之间进行显式转换时,需要这种专业化。