std::out_ptr
| Definiert in Header <memory> |
||
| template< class Pointer = void, class Smart, class... Args > auto out_ptr( Smart& s, Args&&... args ); |
(seit C++23) | |
Gibt ein std::out_ptr_t mit abgeleiteten Template-Argumenten zurück, das Argumente für das Zurücksetzen per Referenz erfasst.
Das Programm ist schlecht formuliert, wenn die Konstruktion des Rückgabewerts (siehe unten) schlecht formuliert ist.
Inhalt |
[edit] Parameter
| s | - | das Objekt (typischerweise ein Smart Pointer), das angepasst werden soll |
| args... | - | die Argumente für das Zurücksetzen, die erfasst werden sollen |
[edit] Rückgabewert
std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...), wobei P Folgendes ist:
-
Pointer, wennPointernicht gleich void ist. Andernfalls, - Smart::pointer, wenn dieser gültig ist und einen Typ bezeichnet. Andernfalls,
- Smart::element_type*, wenn Smart::element_type gültig ist und einen Typ bezeichnet. Andernfalls,
- std::pointer_traits<Smart>::element_type*.
[edit] Hinweise
Benutzer können das Template-Argument für den Template-Parameter Pointer angeben, um mit fremden Funktionen zu interagieren, die einen Pointer* erwarten.
Da alle Argumente für das Zurücksetzen per Referenz erfasst werden, sollte der zurückgegebene out_ptr_t ein temporäres Objekt sein, das am Ende des Ausdrucks, der den Aufruf der fremden Funktion enthält, zerstört wird, um hängende Referenzen zu vermeiden.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_out_ptr |
202106L |
(C++23) | std::out_ptr, std::inout_ptr |
202311L |
(C++26) | freistehendes std::out_ptr und std::inout_ptr |
[edit] Beispiel
Verwenden Sie std::out_ptr, um einen Smart Pointer für sqlite3_open anzupassen, der einen sqlite3** als Ausgabe-Parameter erwartet.
#include <memory> #include <sqlite3.h> int main() { auto close_db = [](sqlite3* db) { sqlite3_close(db); }; { // open an in-memory database, and manage its lifetime with std::unique_ptr std::unique_ptr<sqlite3, decltype(close_db)> up; sqlite3_open(":memory:", std::out_ptr(up)); sqlite3* db = up.get(); // do something with db ... } { // same as above, but use a std::shared_ptr std::shared_ptr<sqlite3> sp; sqlite3_open(":memory:", std::out_ptr(sp, close_db)); sqlite3* db = sp.get(); // do something with db ... } }
[edit] Siehe auch
| (C++23) |
erstellt einen inout_ptr_t mit einem zugehörigen intelligenten Zeiger und Zurücksetzungsargumenten(Funktions-Template) |
| (C++14)(C++20) |
Erstellt einen unique Pointer, der ein neues Objekt verwaltet (Funktionsschablone) |
| erstellt einen geteilten Zeiger, der ein neues Objekt verwaltet (Funktionsschablone) |