std::pointer_traits - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(1) | (desde C++11) |
|
|
(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:
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.
|
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...>.
|
Funciones miembro
| 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:
Funciones no miembro
| Tipo | Definición |
pointer
|
T*
|
element_type
|
T
|
difference_type
|
std::ptrdiff_t |
Plantillas de alias miembro
| Plantilla | Definición |
template< class U > using rebind
|
U*
|
Funciones miembro
| 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
|
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:
Véase también
| Proporciona información sobre los tipos de asignadores. (plantilla de clase) [editar] | |
| Obtiene la dirección real de un objeto, incluso si el operador & está sobrecargado. (plantilla de función) [editar] |