std::pointer_traits
De cppreference.com
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) |
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) |
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] 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 |
(desde C++20) |
Macro de Prueba de característica |
---|
__cpp_lib_constexpr_memory
|
[editar] Ejemplo
Ejecuta este código
#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
(C++11) |
Proporciona información sobre los tipos de asignadores. (plantilla de clase) |
(C++11) |
Obtiene la dirección real de un objeto, incluso si el operador & está sobrecargado. (plantilla de función) |