◐ Shell
clean mode source ↗

std::add_pointer - cppreference.com

De cppreference.com

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

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 produjera
un 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