类模板
<memory>

std::pointer_traits

template <class Ptr> class pointer_traits;    // templatetemplate <class T> class pointer_traits<T*>;  // template specialization
Pointer traits
这是一个用于描述指针和类指针对象某些属性的 traits 类。

头文件 <memory> 同时提供了未特化的版本(对类指针对象提供默认功能),以及一个特化为指针类型的版本(T*).

类指针对象是模拟指针行为的类。该模板的未特化版本可用于任何类指针对象,该类指针对象要么具有element_type作为成员类型,要么是类模板的实例化,其中第一个模板参数用于表示所指向的类型。如果成员rebind和/或 pointer_to 被实例化(参见下文),则需要满足其他要求。

如果类指针对象不满足这些要求,仍可自定义特化此模板类以提供更特定的适用于该类型的功能。

模板参数

Ptr
类指针类型。
T
所指向的类型。

成员类型

以下别名是pointer_traits:

成员类型解释未特化中的定义pointer_traits在...中的定义pointer_traits<T*>特化
指针指针类型模板参数PtrT*
element_type所指值的类型要么Ptr::element_type(如果存在该类型),或者用于实例化该模板的类的第一个模板参数(如果Ptr(如果Ptr是类模板的实例化)。T
difference_type通过减去两个类型为Ptr.Ptr::difference_type(如果存在该类型),或者std::ptrdiff_t否则为 false。std::ptrdiff_t
rebind<V>重新绑定到V要么Ptr::rebind<V>(如果存在该类型),或者用于实例化该模板的类的实例化,使用Ptr作为第一个模板参数(如果VV*Ptr是类模板的实例化)。是别名模板。
*注意rebind是一个别名模板。

成员函数


示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// pointer_traits example
#include <iostream>
#include <memory>

// using pointer_traits to determine return type:
template <class T>
typename std::pointer_traits<T>::element_type dereference_pointer (T pt) {
  return *pt;
}

int main() {
  int* foo = new int(1);
  std::shared_ptr<int> bar (new int(2));

  std::cout << "foo: " << dereference_pointer (foo) << '\n';
  std::cout << "bar: " << dereference_pointer (bar) << '\n';

  delete foo;
  return 0;
}

输出
foo: 1
bar: 2