std::out_ptr
From cppreference.com
| ヘッダ <memory> で定義 |
||
| template< class Pointer = void, class Smart, class... Args > auto out_ptr( Smart& s, Args&&... args ); |
(C++23から) | |
テンプレート引数を推論し、参照によってリセットするための引数をキャプチャするstd::out_ptr_tを返します。
戻り値の構築(下記参照)が不適格である場合、プログラムは不適格です。
目次 |
[編集] パラメータ
| s | - | 適応するオブジェクト(通常はスマートポインタ) |
| args... | - | キャプチャするリセット用の引数 |
[編集] 戻り値
std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...)、ここでPは
-
Pointerがvoidと同一でない場合、Pointer。それ以外の場合、 - Smart::pointerが有効で型を示す場合。それ以外の場合、
- Smart::element_typeが有効で型を示す場合、Smart::element_type*。それ以外の場合、
- std::pointer_traits<Smart>::element_type*.
[編集] 備考
ユーザーは、Pointer*を受け取る外部関数と連携するために、テンプレートパラメータPointerのテンプレート引数を指定できます。
リセットのためのすべての引数は参照によってキャプチャされるため、ぶら下がり参照を避けるために、返されるout_ptr_tは外部関数への呼び出しを含む完全式が終了する時点で破棄される一時オブジェクトであるべきです。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_out_ptr |
202106L |
(C++23) | std::out_ptr、std::inout_ptr |
202311L |
(C++26) | フリースタンディングなstd::out_ptrとstd::inout_ptr |
[編集] 例
sqlite3**を出力パラメータとして期待するsqlite3_openにスマートポインタを適応させるためにstd::out_ptrを使用します。
このコードを実行
#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 ... } }
[編集] 関連項目
| (C++23) |
関連付けられたスマートポインタとリセット引数を持つ inout_ptr_t を作成します(関数テンプレート) |
| (C++14)(C++20) |
新しいオブジェクトを管理する一意のポインタを作成する (関数テンプレート) |
| 新しいオブジェクトを管理する共有ポインタを作成します (関数テンプレート) |