我正在寻找以下结果:
/* 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>> {};
这给出所有假。
或者,
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
并使用 &&
,尽管这不会短路。
关于c++ - 如何编写 "pointer to const"类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370261/