std::pointer_traits
De cppreference.com
<tbody>
</tbody>
| 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:
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
[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:
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
[estático] |
Obtiene un puntero desreferenciable a su argumento. (función miembro estática pública) |
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
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
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) |