根据C++标准的定义实现"is_similar"类型特征
Implementing an `is_similar` type trait based on the definition of the C++ standard
我正在尝试根据标准给出的定义实现is_similar
类型特征(详细信息在这里(:
两种类型的
T1
和T2
如果它们有cv分解,它们是相似的 具有相同的n
,以便相应的Pi
组件是 相同或一个是"Ni
数组",另一个是"未知数组" 绑定",并且用U
表示的类型是相同的。
但是,我不确定是否完全理解它的含义以及如何实现它:
template <class T, class U, class = void>
struct is_similar_base: std::false_type {};
template <class T, class U>
struct is_similar_base<T, U, /* ??? */ >: std::true_type {};
template <class T, class U>
struct is_similar: is_similar_base<T, U> {};
template <class T, class U>
inline constexpr bool is_similar_v = is_similar<T, U>::value;
欢迎任何帮助。
cv 分解将类型"剥离"为交替的const
/volatile
限定符和指针/数组间接寻址层。如果指针/数组间接寻址相同(允许"未知绑定数组"与"n
数组"匹配(,并且下面的类型相同(忽略 cv 限定符(,则类型相似。
所以
// every type is similar to itself
template<typename T, typename U>
struct is_similar_impl : std::is_same<T, U> { };
// we don't care about cv-qualifiers
template<typename T, typename U>
struct is_similar : is_similar_impl<std::remove_cv_t<T>, std::remove_cv_t<U>> { };
// peeling off different kinds of pointers/arrays
template<typename T, typename U>
struct is_similar_impl<T*, U*> : is_similar<T, U> { };
template<typename C, typename T, typename U>
struct is_similar_impl<T C::*, U C::*> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[N], U[N]> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[N], U[]> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[], U[N]> : is_similar<T, U> { };
template<typename T, typename U>
constexpr inline bool is_similar_v = is_similar<T, U>::value;
Godbolt 和测试用例
相关文章:
- 'char (*RtlpNumberOf(T (&)[N]))[N]':无法从"char *"
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- "inline"、"constexpr"或"noexcept"
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"
- 我必须安装"libbitcoin-server"才能包含"bitcoin.hpp"
- “并非所有控制路径都返回一个值./&quot“控制可能达到非空隙功能的末端”.验证时循环时
- 如何输出a'&quot在不使用线端的情况下进行文件
- 删除“按任何键” ..&quot.从VS C 控制台应用程序
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"
- '&lt;'''&lt;'''&quot的模板类错误''令牌”
- Box2d c++ what is the similar to ActionScript b2Body SetPosi
- 错误:"2 overloads have similar conversions"
- 是否可以防止此代码"copy and paste similar template special case"?
- 错误消息:"jj"的名称查找已更改为ISO"for"范围,(如果您使用"