根据C++标准的定义实现"is_similar"类型特征

Implementing an `is_similar` type trait based on the definition of the C++ standard

本文关键字:quot similar 类型 特征 is C++ 定义 实现 根据 标准      更新时间:2023-10-16

我正在尝试根据标准给出的定义实现is_similar类型特征(详细信息在这里(:

两种类型的T1T2如果它们有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 和测试用例