std:: pointer_traits
|
定义于头文件
<memory>
|
||
|
template
<
class
Ptr
>
struct pointer_traits ; |
(1) | (C++11 起) |
|
template
<
class
T
>
struct pointer_traits < T * > ; |
(2) | (C++11 起) |
pointer_traits
类模板提供了标准化的方式来访问指针类类型的某些属性(
花式指针
,例如
boost::interprocess::offset_ptr
)。标准模板
std::allocator_traits
依赖
pointer_traits
来确定
Allocator
所需的各种类型别名的默认值。
pointer_traits
有条件地声明以下成员:
令 /*element-type-of*/ < Ptr > 为
- 若存在则为 Ptr :: element_type ;
-
否则,若
Ptr是类模板特化 Template < T, Args... > (其中 Args... 是零个或多个类型参数)则为T; - 否则未定义。
若 /*element-type-of*/ < Ptr > 未定义,则主模板不包含本页指定的成员。
目录 |
成员类型
| 类型 | 定义 |
pointer
|
Ptr |
element_type
|
/*element-type-of*/ < Ptr > |
difference_type
|
若存在则为 Ptr :: difference_type ,否则为 std::ptrdiff_t |
成员别名模板
| 模板 | 定义 |
| template < class U > using rebind |
若存在则为
Ptr
::
rebind
<
U
>
,否则若
Ptr
是模板特化
Template
<
T, Args...
>
则为
Template
<
U, Args...
>
|
成员函数
|
[静态]
|
获得指向其参数的可解引用指针
(公开静态成员函数) |
成员类型
| 类型 | 定义 |
pointer
|
T * |
element_type
|
T |
difference_type
|
std::ptrdiff_t |
成员别名模板
| 模板 | 定义 |
| template < class U > using rebind | U * |
成员函数
|
[static]
|
获取指向其参数的可解引用指针
(公开静态成员函数) |
程序定义特化的可选成员函数
|
[静态]
(C++20)
(可选)
|
从智能指针获取原始指针(
pointer_to
的逆操作)
(公开静态成员函数) |
注释
rebind 成员模板别名使得在给定指向
T
的指针式类型时,能够获取指向
U
的相同指针式类型。例如,
using another_pointer = std::pointer_traits<std::shared_ptr<int>>::rebind<double>; static_assert(std::is_same<another_pointer, std::shared_ptr<double>>::value);
|
针对用户定义花式指针类型的特化可提供额外的静态成员函数
|
(since C++20) |
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_constexpr_memory
|
201811L
|
(C++20) |
constexpr
in
std::pointer_traits
|
示例
#include <iostream> #include <memory> template<class Ptr> struct BlockList { // 预定义内存块 struct block; // 根据指针类型 Ptr 定义指向内存块的指针类型 // 若 Ptr 为任意类型的 T*,则 block_ptr_t 为 block* // 若 Ptr 为 smart_ptr<T>,则 block_ptr_t 为 smart_ptr<block> using block_ptr_t = typename std::pointer_traits<Ptr>::template rebind<block>; struct block { std::size_t size{}; block_ptr_t next_block{}; }; block_ptr_t free_blocks; }; int main() { [[maybe_unused]] BlockList<int*> bl1; // bl1.free_blocks 的类型是 BlockList<int*>::block* BlockList<std::shared_ptr<char>> bl2; // bl2.free_blocks 的类型是 // std::shared_ptr<BlockList<std::shared_ptr<char>>::block> std::cout << bl2.free_blocks.use_count() << '\n'; }
输出:
0
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| DR | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3545 | C++11 |
当
element_type
无效时,主模板会导致硬错误
|
改为支持SFINAE |
参见
|
(C++11)
|
提供分配器类型的相关信息
(类模板) |
|
(C++11)
|
获取对象的实际地址,即使
&
运算符已被重载
(函数模板) |