类模板
<memory>

std::allocator_traits

template <class Alloc> struct allocator_traits;
分配器特性
此模板为分配器类型提供统一的接口。

未特化的版本提供了一个接口,允许任何提供至少一个公共成员类型value_type以及公共成员函数allocatedeallocate(参见示例)。

但是,通过特化此类来提供接口,任何类类型都可以用作分配器。

模板参数

Alloc
分配器类型,别名为成员类型allocator_type.

成员类型

以下别名是allocator_traits。任何特化也应定义这些成员类型

成员类型未特化中的定义allocator_traits
allocator_type模板参数(Alloc)
value_typeallocator_type::value_type
指针allocator_type::pointer(如果已定义)
value_type*(否则)
const_pointerallocator_type::const_pointer(如果已定义)
pointer_traits<pointer>::rebind<const value_type>(否则)
void_pointerallocator_type::void_pointer(如果已定义)
pointer_traits<pointer>::rebind<void>(否则)
const_void_pointerallocator_type::const_void_pointer(如果已定义)
pointer_traits<pointer>::rebind<const void>(否则)
difference_typeallocator_type::difference_type(如果已定义)
pointer_traits<pointer>::difference_type(否则)
size_typeallocator_type::size_type(如果已定义)
make_unsigned<difference_type>::type(否则)
propagate_on_container_copy_assignmentallocator_type::propagate_on_container_copy_assignment(如果已定义)
false_type(否则)
propagate_on_container_move_assignmentallocator_type::propagate_on_container_move_assignment(如果已定义)
false_type(否则)
propagate_on_container_swapallocator_type::propagate_on_container_swap(如果已定义)
false_type(否则)
rebind_alloc<T>allocator_type::rebind<T>::other(如果已定义)
AllocTemplate<T,Args>(如果Alloc是以下形式的实例化AllocTemplate<U,Args>,其中Args是零个或多个类型参数)
* 注意:这是一个别名模板
rebind_traits<T>allocator_traits<rebind_alloc<T>>
* 注意:这是一个别名模板

静态成员函数


示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// custom allocator example
#include <cstddef>
#include <iostream>
#include <memory>
#include <vector>

template <class T>
struct custom_allocator {
  typedef T value_type;
  custom_allocator() noexcept {}
  template <class U> custom_allocator (const custom_allocator<U>&) noexcept {}
  T* allocate (std::size_t n) { return static_cast<T*>(::operator new(n*sizeof(T))); }
  void deallocate (T* p, std::size_t n) { ::delete(p); }
};

template <class T, class U>
constexpr bool operator== (const custom_allocator<T>&, const custom_allocator<U>&) noexcept
{return true;}

template <class T, class U>
constexpr bool operator!= (const custom_allocator<T>&, const custom_allocator<U>&) noexcept
{return false;}

int main () {
  std::vector<int,custom_allocator<int>> foo = {10,20,30};
  for (auto x: foo) std::cout << x << " ";
  std::cout << '\n';
  return 0;
}

可能的输出
10 20 30