如何编写 "pointer to const" 类型特征?
How do I write a "pointer to const" type trait?
我正在寻找以下结果:
/* true */ std::cout << ptr_to_const_v<const int*> << '\n';
/* true */ std::cout << ptr_to_const_v<const int*const> << '\n';
/* false */ std::cout << ptr_to_const_v<int*> << '\n';
/* false */ std::cout << ptr_to_const_v<int*const> << '\n';
这是我对类型特征的尝试:
template <typename T>
struct ptr_to_const : std::is_const<std::remove_pointer<T>> {};
这给出所有 false。
或者,
template <typename T>
struct ptr_to_const : std::is_const<const std::remove_pointer<T>> {};
这给出所有 true。
我想这是因为 const 是类型的限定符,而不是类型本身的一部分。
我能做什么?
您正在检查 std::remove_pointer
类型特征的类型,而不是应用了该特征的类型。
C++14:
template <typename T>
struct ptr_to_const : std::is_const<std::remove_pointer_t<T>> {};
^^
年长者:
template <typename T>
struct ptr_to_const : std::is_const<typename std::remove_pointer<T>::type> {};
^^^^^^^^^ ^^^^^^
但是,由于您只是简单地删除了指针,因此您无法判断 T
最初是否是一个指针,这使得该特征过于宽松。既然你给这个C++1z打上了标签,你就可以使用std::conjunction
,这基本上是一个短路元编程&&
:
template <typename T>
struct ptr_to_const : std::conjunction<
std::is_pointer<T>,
std::is_const<std::remove_pointer_t<T>>
> {};
您也可以选择 C++1z bool_constant
并使用 &&
,尽管这不会短路。
template<class T>
using ptr_to_const = std::conjunction<std::is_pointer<T>,
std::is_const<std::remove_pointer_t<T>>>;
我正在寻找以下结果:
/* true */ std::cout << ptr_to_const_v<const int*> << '\n';
/* true */ std::cout << ptr_to_const_v<const int*const> << '\n';
/* false */ std::cout << ptr_to_const_v<int*> << '\n';
/* false */ std::cout << ptr_to_const_v<int*const> << '\n';
这是我对类型特征的尝试:
template <typename T>
struct ptr_to_const : std::is_const<std::remove_pointer<T>> {};
这给出所有 false。
或者,
template <typename T>
struct ptr_to_const : std::is_const<const std::remove_pointer<T>> {};
这给出所有 true。
我想这是因为 const 是类型的限定符,而不是类型本身的一部分。
我能做什么?
您正在检查 std::remove_pointer
类型特征的类型,而不是应用了该特征的类型。
C++14:
template <typename T>
struct ptr_to_const : std::is_const<std::remove_pointer_t<T>> {};
^^
年长者:
template <typename T>
struct ptr_to_const : std::is_const<typename std::remove_pointer<T>::type> {};
^^^^^^^^^ ^^^^^^
但是,由于您只是简单地删除了指针,因此您无法判断 T
最初是否是一个指针,这使得该特征过于宽松。既然你给这个C++1z打上了标签,你就可以使用std::conjunction
,这基本上是一个短路元编程&&
:
template <typename T>
struct ptr_to_const : std::conjunction<
std::is_pointer<T>,
std::is_const<std::remove_pointer_t<T>>
> {};
您也可以选择 C++1z bool_constant
并使用 &&
,尽管这不会短路。
template<class T>
using ptr_to_const = std::conjunction<std::is_pointer<T>,
std::is_const<std::remove_pointer_t<T>>>;