Espacios de nombres
Variantes
Acciones

std::add_pointer

De cppreference.com
< cpp‎ | types
 
 
Biblioteca de servicios
 
Apoyo de tipos
Tipos básicos
Tipos fundamentales
Tipos enteros de anchura fija (C++11)
Límites numéricos
Interfaz de C de límites numéricos
Información de tipo
en tiempo de ejecución
Rasgos de tipos
Categorías de tipos
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
Operaciones soportadas
Relaciones y consultas de propiedades
Modificaciones de tipos
(C++11)(C++11)(C++11)
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
(C++11)(hasta C++20)(C++17)
 
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 produjera
un 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

Comprueba si un tipo es un tipo puntero
(plantilla de clase) [editar]
Elimina el puntero del tipo dado
(plantilla de clase) [editar]