std::remove_pointer - cppreference.com

From cppreference.com

template< class T > struct remove_pointer;

(since C++11)

Provides the member typedef type which is the type pointed to by T, or, if T is not a pointer, then type is the same as T.

If the program adds specializations for std::remove_pointer, the behavior is undefined.

Member types

Name Definition
type the type pointed to by T or T if it's not a pointer

Helper types

template< class T > using remove_pointer_t = typename remove_pointer<T>::type;

(since C++14)

Possible implementation

template<class T> struct remove_pointer { typedef T type; };
template<class T> struct remove_pointer<T*> { typedef T type; };
template<class T> struct remove_pointer<T* const> { typedef T type; };
template<class T> struct remove_pointer<T* volatile> { typedef T type; };
template<class T> struct remove_pointer<T* const volatile> { typedef T type; };

Example

#include <type_traits>

static_assert
(
    std::is_same_v<int, int> == true &&
    std::is_same_v<int, int*> == false &&
    std::is_same_v<int, int**> == false &&
    std::is_same_v<int, std::remove_pointer_t<int>> == true &&
    std::is_same_v<int, std::remove_pointer_t<int*>> == true &&
    std::is_same_v<int, std::remove_pointer_t<int**>> == false &&
    std::is_same_v<int, std::remove_pointer_t<int* const>> == true &&
    std::is_same_v<int, std::remove_pointer_t<int* volatile>> == true &&
    std::is_same_v<int, std::remove_pointer_t<int* const volatile>> == true
);

int main() {}

See also