Namensräume
Varianten
Aktionen

std::pointer_traits

Von cppreference.com
< cpp‎ | memory
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
std::pointer_traits
Memberfunktionen
 
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.

1) Das nicht-spezialisierte pointer_traits deklariert bedingt die folgenden Member

Sei /*element-type-of*/<Ptr>

  • Ptr::element_type, falls vorhanden;
  • andernfalls T, falls Ptr eine 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]
2) Eine Spezialisierung ist für Zeigertypen, T*, vorgesehen, die die folgenden Member deklariert

[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]

[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]

[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

liefert Informationen über Allocator-Typen
(Klassen-Template) [edit]
(C++11)
ermöglicht den Zugriff auf die tatsächliche Adresse eines Objekts, auch wenn der &-Operator überladen ist
(Funktions-Template) [edit]