std:: pointer_traits
|
Definiert im Header
<memory>
|
||
|
template
<
class
Ptr
>
struct pointer_traits ; |
(1) | (seit C++11) |
|
template
<
class
T
>
struct pointer_traits < T * > ; |
(2) | (seit C++11) |
Die
pointer_traits
-Klassentemplate bietet die standardisierte Methode, um auf bestimmte Eigenschaften von zeigerähnlichen Typen zuzugreifen (
fancy pointers
, wie z.B.
boost::interprocess::offset_ptr
). Die Standard-Template
std::allocator_traits
verlässt sich auf
pointer_traits
, um die Standardwerte für verschiedene typedefs zu bestimmen, die von
Allocator
benötigt werden.
pointer_traits
deklariert bedingt die folgenden Member:
Sei /*element-type-of*/ < Ptr > definiert als:
- Ptr :: element_type falls vorhanden;
-
andernfalls
TfallsPtreine Klassentemplatespezialisierung Template < T, Args... > ist, wobei Args... null oder mehr Typargumente sind; - andernfalls nicht definiert.
Falls /*element-type-of*/ < Ptr > nicht definiert ist, hat das primäre Template keine auf dieser Seite spezifizierten Member.
Inhaltsverzeichnis |
Member-Typen
| Typ | Definition |
pointer
|
Ptr |
element_type
|
/*element-type-of*/ < Ptr > |
difference_type
|
Ptr :: difference_type falls vorhanden, andernfalls std::ptrdiff_t |
Member-Alias-Templates
| Template | Definition |
| template < class U > using rebind |
Ptr
::
rebind
<
U
>
falls vorhanden, andernfalls
Template
<
U, Args...
>
falls
Ptr
eine Templatespezialisierung
Template
<
T, Args...
>
ist
|
Member-Funktionen
|
[static]
|
erhält einen dereferenzierbaren Zeiger auf sein Argument
(öffentliche statische Member-Funktion) |
Member-Typen
| Typ | Definition |
pointer
|
T * |
element_type
|
T |
difference_type
|
std::ptrdiff_t |
Member-Alias-Templates
| Template | Definition |
| template < class U > using rebind | U * |
Member-Funktionen
|
[static]
|
erhält einen dereferenzierbaren Zeiger auf sein Argument
(öffentliche statische Member-Funktion) |
Optionale Memberfunktionen programmdefinierter Spezialisierungen
|
[static]
(C++20)
(optional)
|
erhält einen Rohzeiger von einem Fancy Pointer (Umkehrung von
pointer_to
)
(öffentliche statische Elementfunktion) |
Hinweise
Die rebind-Member-Template-Alias ermöglicht es, ausgehend von einem zeigerähnlichen Typ, der auf
T
zeigt, den gleichen 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 Memberfunktion
|
(seit C++20) |
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_constexpr_memory
|
201811L
|
(C++20) |
constexpr
in
std::pointer_traits
|
Beispiel
#include <iostream> #include <memory> template<class Ptr> struct BlockList { // Speicherblock vordefinieren struct block; // Zeiger auf Speicherblock aus der Zeigerart Ptr definieren // Wenn Ptr irgendeine Art von T* ist, ist block_ptr_t block* // Wenn Ptr smart_ptr<T> ist, ist 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; // Der Typ von bl1.free_blocks ist BlockList<int*>:: block* BlockList<std::shared_ptr<char>> bl2; // Der Typ von bl2.free_blocks ist // std::shared_ptr<BlockList<std::shared_ptr<char>>::block> std::cout << bl2.free_blocks.use_count() << '\n'; }
Ausgabe:
0
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 |
Primäres Template verursachte Hard Error wenn
element_type
ungültig ist
|
SFINAE-freundlich gemacht |
Siehe auch
|
(C++11)
|
stellt Informationen über Allokator-Typen bereit
(Klassen-Template) |
|
(C++11)
|
ermittelt die tatsächliche Adresse eines Objekts, selbst wenn der
&
Operator überladen ist
(Funktions-Template) |