Espacios de nombres
Variantes
Acciones

std::pointer_traits

De cppreference.com
< cpp‎ | memory
 
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
pointer_traits
(C++11)
(C++20)
(C++11)
(C++11)
 
std::pointer_traits
Funciones miembro
 
Definido en el archivo de encabezado <memory>
template< class Ptr > struct pointer_traits;
(1) (desde C++11)
template< class T > struct pointer_traits<T*>;
(2) (desde C++11)

La plantilla de clase pointer_traits proporciona la forma estandarizada de acceder a ciertas propiedades de tipos similares a punteros (punteros sofisticados, tales como boost::interprocess::offset_ptr). La plantilla estándar std::allocator_traits se basa en pointer_traits para determinar los valores predeterminados para varias definiciones de tipo (typedef)s requeridos por Allocator.

1) La plantilla de clase pointer_traits no especializada declara los siguientes tipos:

Contenido

[editar] Tipos miembro

Tipo Definición
pointer Ptr.
element_type Ptr::element_type si está presente. De lo contrario T si Ptr es una especialización de plantilla Template<T, Args...>. De lo contrario, la especialización pointer_traits está mal formada
difference_type Ptr::difference_type si está presente, de lo contrario std::ptrdiff_t.

[editar] Plantillas de alias miembro

Plantilla Definición
template <class U> using rebind Ptr::rebind<U> si existe, de lo contrario Template<U, Args...> si Ptr es una especialización de plantilla Template<T, Args...>.

[editar] Funciones miembro

[estático]
Obtiene un puntero desreferenciable a su argumento.
(función miembro estática pública) [editar]
Funciones miembro opcionales de especializaciones definidas por el programa
[estático] (C++20)(opcional)
Obtiene un puntero sin formato a partir de un puntero sofisticado (el inverso de pointer_to)
(función miembro estática pública) [editar]
2) Se proporciona una especialización para los tipos puntero, T*, que declara los siguientes tipos:

[editar] Funciones no miembro

Tipo Definición
pointer T*
element_type T
difference_type std::ptrdiff_t

[editar] Plantillas de alias miembro

Plantilla Definición
template< class U > using rebind U*

[editar] Funciones miembro

[estático]
Obtiene un puntero desreferenciable a su argumento.
(función miembro estática pública) [editar]

[editar] Notas

La plantilla de alias miembro rebind hace posible, dado un tipo puntero que apunta a T, obtener el mismo tipo puntero que apunta a U. Por ejemplo,

using another_pointer = std::pointer_traits<std::shared_ptr<int>>::rebind<double>;
static_assert(std::is_same<another_pointer, std::shared_ptr<double>>::value);

Una especialización para tipos punteros sofisticados definidos por el usuario puede proporcionar una función miembro estática adicional to_address para personalizar el comportamiento de std::to_address.

(desde C++20)


Macro de Prueba de característica
__cpp_lib_constexpr_memory

[editar] Ejemplo

#include <memory>
#include <iostream>
 
template <class Ptr>
struct BlockList
{
   // Predefinir un bloque de memoria 
   struct block;
 
   // Definir un puntero a un bloque de memoria a partir del tipo puntero Ptr s
   // Si Ptr es cualquier tipo de T*, block_ptr_t es block*
   // Si Ptr es smart_ptr<T>, block_ptr_t es 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;
    // El tipo de bl1.free_blocks es BlockList<int*>:: block*
 
    BlockList<std::shared_ptr<char>> bl2;
    // El tipo de bl2.free_blocks es
    // std::shared_ptr< BlockList<std::shared_ptr<char> >::block>
    std::cout << bl2.free_blocks.use_count() << '\n';
}

Salida:

​0​

[editar] Véase también

Proporciona información sobre los tipos de asignadores.
(plantilla de clase) [editar]
(C++11)
Obtiene la dirección real de un objeto, incluso si el operador & está sobrecargado.
(plantilla de función) [editar]