std::add_pointer
Definido en el archivo de encabezado <type_traits>
|
||
template< class T > struct add_pointer; |
(desde C++11) | |
Si T
es un tipo referencia, proporciona la definición de tipo (typedef) miembro type
, que es un puntero al tipo al que se hace referencia.
De lo contrario, si T denomina un tipo objeto, un tipo función que no está calificado-cv o calificado-ref, o un tipo void (posiblemente calificado-cv), proporciona la definición de tipo (typedef) miembro type
, que es el tipo T*
.
De lo contrario (si T es un tipo función calificado-cv o calificado-ref), proporciona la definición de tipo (typedef) miembro type
, que es el tipo T
.
El comportamiento de un programa que añade especializaciones para add_pointer
no está definido.
Contenido |
[editar] Tipos miembro
Nombre | Definición |
type
|
Puntero a T o al tipo al que hace referencia T .
|
[editar] Tipos auxiliares
template< class T > using add_pointer_t = typename add_pointer<T>::type; |
(desde C++14) | |
[editar] Posible implementación
namespace detail { template <class T> struct type_identity { using type = T; }; // o usar std::type_identity (desde C++20) template <class T> auto try_add_pointer(int) -> type_identity<typename std::remove_reference<T>::type*>; template <class T> auto try_add_pointer(...) -> type_identity<T>; } // namespace detail template <class T> struct add_pointer : decltype(detail::try_add_pointer<T>(0)) {}; |
[editar] Example
#include <iostream> #include <type_traits> int main() { int i = 123; int& ri = i; typedef std::add_pointer<decltype(i)>::type IntPtr; typedef std::add_pointer<decltype(ri)>::type IntPtr2; IntPtr pi = &i; std::cout << "i = " << i << "\n"; std::cout << "*pi = " << *pi << "\n"; static_assert(std::is_pointer<IntPtr>::value, "IntPtr debe ser un puntero"); static_assert(std::is_same<IntPtr, int*>::value, "IntPtr debe ser un puntero a int"); static_assert(std::is_same<IntPtr2, IntPtr>::value, "IntPtr2 debe ser igual a IntPtr"); typedef std::remove_pointer<IntPtr>::type IntAgain; IntAgain j = i; std::cout << "j = " << j << "\n"; static_assert(!std::is_pointer<IntAgain>::value, "IntAgain no debe ser un puntero"); static_assert(std::is_same<IntAgain, int>::value, "IntAgain debe ser igual a int"); }
Salida:
i = 123 *pi = 123 j = 123
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 2101 | C++11 | Se requería que std::add_pointer produjeraun puntero a tipos función calificados-cv o calificados-ref. |
Produce los tipos función mismos calificados-cv o calificados-ref. |
[editar] Véase también
(C++11) |
Comprueba si un tipo es un tipo puntero (plantilla de clase) |
(C++11) |
Elimina el puntero del tipo dado (plantilla de clase) |