c++ - 如何编写 "pointer to const"类型特征?

标签 c++ templates constants typetraits c++17

我正在寻找以下结果:

/* 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/

相关文章:

c++ - 我如何使用内置 Web 服务器部署 Wt 应用程序?

c++ - 自动扣除别名模板和模板类的模板参数

c++ - 模板彼此交友

c++ - 在 VC++ 中将常量 char 分配给结构内部的字符数组

c++ - 使用 const char 出错

c++ - 为什么我们说#define Processor 在程序中创建多个拷贝?

c++ - QWidgetAction 在 trigger() 之后保持可见

c++ - 如果对象是堆栈创建的(包括继承类型),是否可能发出编译错误?

c++ - 是否有与 WaitforSingleObject 等效的 C++?

c++ - 如何在模板与 union 之间继承?