Spec-Zone.ru › C++

std::pointer_traits

Определён в заголовочном файле <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 для определения значений по умолчанию для различных псевдонимов типов, требуемых аллокатором.

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...>

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

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

Типы-члены

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

Шаблоны псевдонимов-членов

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

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

pointer_to
[static]
получает указатель, который можно разыменовать, на свой аргумент
(открытая статическая функция-член)

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

to_address
[static] (C++20)(необязательная)
получает обычный указатель из указателя с расширенными возможностями (обратная операция для pointer_to)
(открытая статическая функция-член)

Примечания

Шаблонный псевдоним-член 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.

(начиная с C++20)
Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_lib_constexpr_memory 201811L (C++20) constexpr в std::pointer_traits
202506L (C++26) Версия std::pointer_traits с constexpr

Пример

#include <iostream>
#include <memory>

template<class Ptr>
struct BlockList
{
    // Predefine a memory block
    struct block;

    // Define a pointer to a memory block from the kind of pointer Ptr s
    // If Ptr is any kind of T*, block_ptr_t is block*
    // If Ptr is smart_ptr<T>, block_ptr_t is 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;
    // The type of bl1.free_blocks is BlockList<int*>:: block*

    BlockList<std::shared_ptr<char>> bl2;
    // The type of bl2.free_blocks is
    // std::shared_ptr<BlockList<std::shared_ptr<char>>::block>
    std::cout << bl2.free_blocks.use_count() << '\n';
}

Вывод:

0

Отчёты об ошибках

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

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
LWG 3545 C++11 первичный шаблон приводил к безусловной ошибке, если element_type некорректен обеспечена совместимость с SFINAE

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/pointer_traits

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API