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
для определения значений по умолчанию для различных typedef-объявлений, требуемых
Allocator
.
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) |
Типы членов
| Тип | Определение |
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);
|
Специализация для пользовательских типов умных указателей может предоставлять дополнительную статическую функцию-член
|
(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)
|
предоставляет информацию о типах аллокаторов
(шаблон класса) |
|
(C++11)
|
получает фактический адрес объекта, даже если
&
оператор перегружен
(шаблон функции) |