std::pointer_traits
| Definiert in Header <memory> |
||
| template< class Ptr > struct pointer_traits; |
(1) | (seit C++11) |
| template< class T > struct pointer_traits<T*>; |
(2) | (seit C++11) |
Die Klassenvorlage pointer_traits bietet die standardisierte Methode zum Zugriff auf bestimmte Eigenschaften von zeigerähnlichen Typen (Fancy Pointers, wie z.B. boost::interprocess::offset_ptr). Die Standardvorlage std::allocator_traits nutzt pointer_traits, um die Standardwerte für verschiedene durch Allocator erforderliche Typedefs zu bestimmen.
pointer_traits deklariert bedingt die folgenden MemberSei /*element-type-of*/<Ptr>
- Ptr::element_type, falls vorhanden;
- andernfalls
T, fallsPtreine Klassenvorlagen-Spezialisierung ist Template<T, Args...>, wobei Args... null oder mehr Typargumente sind; - andernfalls nicht definiert.
Wenn /*element-type-of*/<Ptr> nicht definiert ist, hat die primäre Vorlage keine auf dieser Seite spezifizierten Member.
Inhalt |
[bearbeiten] Member-Typen
| Typ | Definition |
Zeiger
|
Ptr |
element_type
|
/*element-type-of*/<Ptr> |
difference_type
|
Ptr::difference_type, falls vorhanden, andernfalls std::ptrdiff_t |
[bearbeiten] Member-Alias-Vorlagen
| Template | Definition |
| template< class U > using rebind | Ptr::rebind<U>, falls vorhanden, andernfalls Template<U, Args...>, falls Ptr eine Vorlagenspezialisierung ist Template<T, Args...> |
[bearbeiten] Member-Funktionen
| [static] |
ermittelt einen dereferenzierbaren Zeiger auf sein Argument (public static member function) |
[bearbeiten] Member-Typen
| Typ | Definition |
Zeiger
|
T* |
element_type
|
T |
difference_type
|
std::ptrdiff_t |
[bearbeiten] Member-Alias-Vorlagen
| Template | Definition |
| template< class U > using rebind | U* |
[bearbeiten] Member-Funktionen
| [static] |
ermittelt einen dereferenzierbaren Zeiger auf sein Argument (public static member function) |
[bearbeiten] Optionale Member-Funktionen von programmierdefinierten Spezialisierungen
| [static] (C++20)(optional) |
Ermittelt einen Roh-Zeiger aus einem Fancy Pointer (Inverse von pointer_to)(public static member function) |
[bearbeiten] Anmerkungen
Die `rebind`-Member-Vorlagen-Alias ermöglicht es, gegeben einen zeigerähnlichen Typ, der auf `T` zeigt, denselben zeigerähnlichen Typ zu erhalten, der auf `U` zeigt. Zum Beispiel:
using another_pointer = std::pointer_traits<std::shared_ptr<int>>::rebind<double>; static_assert(std::is_same<another_pointer, std::shared_ptr<double>>::value);
|
Eine Spezialisierung für benutzerdefinierte Fancy-Pointer-Typen kann eine zusätzliche statische Member-Funktion `to_address` bereitstellen, um das Verhalten von std::to_address anzupassen. |
(seit C++20) |
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_constexpr_memory |
201811L |
(C++20) | constexpr in std::pointer_traits |
[bearbeiten] Beispiel
#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'; }
Ausgabe
0
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3545 | C++11 | Die primäre Vorlage verursachte einen Hard Error, wenn element_type ungültig war |
Wurde SFINAE-freundlich gemacht. |
[bearbeiten] Siehe auch
| (C++11) |
liefert Informationen über Allocator-Typen (Klassen-Template) |
| (C++11) |
ermöglicht den Zugriff auf die tatsächliche Adresse eines Objekts, auch wenn der &-Operator überladen ist(Funktions-Template) |