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)
Макрос проверки наличия функции Значение Std Функция
__cpp_lib_constexpr_memory 201811L (C++20) constexpr в std::pointer_traits

Пример

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

DR Применено к Поведение как опубликовано Правильное поведение
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/w/cpp/memory/pointer_traits

Spec-Zone.ru

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