Namespaces
Variants

std:: pointer_traits

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
std::pointer_traits
Member functions
(C++20) (optional)
Определено в заголовке <memory>
template < class Ptr >
struct pointer_traits ;
(1) (начиная с C++11)
template < class T >
struct pointer_traits < T * > ;
(2) (начиная с C++11)

Класс-шаблон pointer_traits предоставляет стандартизированный способ доступа к определённым свойствам указательноподобных типов ( нестандартные указатели , такие как boost::interprocess::offset_ptr ). Стандартный шаблон std::allocator_traits использует pointer_traits для определения значений по умолчанию для различных typedef-объявлений, требуемых Allocator .

1) Неспециализированный pointer_traits условно объявляет следующие члены:

Пусть /*element-type-of*/ < Ptr > будет

  • Ptr :: element_type если присутствует;
  • иначе, T если Ptr является специализацией шаблона класса Template < T, Args... > , где Args... - ноль или более аргументов типа;
  • иначе, не определено.

Если /*element-type-of*/ < Ptr > не определен, основная специализация не имеет членов, указанных на этой странице.

Содержание

Типы членов

Тип Определение
pointer Ptr
element_type /*element-type-of*/ < Ptr >
difference_type Ptr :: difference_type если присутствует, иначе std::ptrdiff_t

Псевдонимы-шаблоны членов

Шаблон Определение
template < class U > using rebind Ptr :: rebind < U > если существует, иначе Template < U, Args... > если Ptr является специализацией шаблона Template < T, Args... >

Функции-члены

[static]
получает разыменовываемый указатель на свой аргумент
(public static member function)
2) Для типов указателей предоставляется специализация, T * , которая объявляет следующие члены:

Типы членов

Тип Определение
pointer T *
element_type T
difference_type std::ptrdiff_t

Псевдонимы шаблонов членов

Шаблон Определение
template < class U > using rebind U *

Функции членов

[static]
получает разыменовываемый указатель на свой аргумент
(public static member function)

Дополнительные функции-члены специализаций, определенных программой

[static] (C++20) (optional)
получает необработанный указатель из умного указателя (обратная операция к pointer_to )
(public static member function)

Примечания

Шаблонный псевдоним rebind позволяет, имея указатель-подобный тип, указывающий на T , получить тот же указатель-подобный тип, указывающий на U . Например,

using another_pointer = std::pointer_traits<std::shared_ptr<int>>::rebind<double>;
static_assert(std::is_same<another_pointer, std::shared_ptr<double>>::value);

Специализация для пользовательских типов умных указателей может предоставлять дополнительную статическую функцию-член to_address для настройки поведения std::to_address .

(since C++20)
Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_constexpr_memory 201811L (C++20) constexpr в std::pointer_traits

Пример

#include <iostream>
#include <memory>
template<class Ptr>
struct BlockList
{
    // Предопределение блока памяти
    struct block;
    // Определение указателя на блок памяти из типа указателя Ptr
    // Если Ptr - это любой тип T*, то block_ptr_t - это block*
    // Если Ptr - это smart_ptr<T>, то block_ptr_t - это smart_ptr<block>
    using block_ptr_t = typename std::pointer_traits<Ptr>::template rebind<block>;
    struct block
    {
        std::size_t size{};
        block_ptr_t next_block{};
    };
    block_ptr_t free_blocks;
};
int main()
{
    [[maybe_unused]]
    BlockList<int*> bl1;
    // Тип bl1.free_blocks - это BlockList<int*>::block*
    BlockList<std::shared_ptr<char>> bl2;
    // Тип bl2.free_blocks - это
    // std::shared_ptr<BlockList<std::shared_ptr<char>>::block>
    std::cout << bl2.free_blocks.use_count() << '\n';
}

Вывод:

​0​

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3545 C++11 primary template caused hard error when element_type is invalid made SFINAE-friendly

Смотрите также

предоставляет информацию о типах аллокаторов
(шаблон класса)
(C++11)
получает фактический адрес объекта, даже если & оператор перегружен
(шаблон функции)