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.
Tipos miembro
| Nombre | Definición |
type
|
Puntero a T o al tipo al que hace referencia T.
|
Tipos auxiliares
<tbody> </tbody> template< class T > using add_pointer_t = typename add_pointer<T>::type; |
(desde C++14) | |
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)) {};
|
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
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. |
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) |