std::experimental::unique_resource
From cppreference.com
< cpp | experimental
| ヘッダ <experimental/scope> で定義 |
||
| template< class R, class D > class unique_resource; |
(ライブラリ基本TS v3) | |
unique_resourceは、リソースハンドルを介してリソースを所有・管理し、unique_resourceが破棄されるときにそのリソースを解放する、汎用的なRAIIラッパーです。
リソースは、以下のいずれかが発生したときに、型Dのデリータを用いて解放されます。
- 管理している
unique_resourceオブジェクトが破棄されたとき - 管理している
unique_resourceオブジェクトに operator= または reset() を介して別のリソースが代入されたとき
Rがオブジェクト型の場合、型RSはRとし、それ以外の場合はstd::reference_wrapper<std::remove_reference_t<R>>とします。
-
unique_resourceは、リソースハンドルであるか、あるいはそれをラップする型RSのサブオブジェクトと、型Dのデリータ、そしてラッパーがリソースを所有しているかどうかを示すboolフラグを実質的に保持します。 - 説明のため、型
RSのサブオブジェクトを「格納されたリソースハンドル (stored resource handle)」、そして格納された(Rがオブジェクト型の場合)またはラップされた(Rが参照型の場合)Rを「基底のリソースハンドル (underlying resource handle)」と呼びます。これら2つの用語はLFTSでは使用されていません。
目次 |
[編集] テンプレートパラメータ
| R | - | リソースハンドルの型 |
| D | - | デリータの型 |
| 型要件 | ||
-Rはオブジェクト型またはオブジェクト型への左辺値参照でなければなりません。UnrefRをstd::remove_reference_t<R>とすると、UnrefRはムーブ構築可能 (MoveConstructible) でなければならず、もしUnrefRがコピー構築可能 (CopyConstructible) でない場合、std::is_nothrow_move_constructible_v<UnrefR>はtrueでなければなりません。 | ||
-Dは破棄可能 (Destructible)かつムーブ構築可能 (MoveConstructible)な関数オブジェクト (FunctionObject)型でなければならず、もしDがコピー構築可能 (CopyConstructible)でない場合、std::is_nothrow_move_constructible_v<D>はtrueでなければなりません。型Dの左辺値dと型UnrefRの左辺値rが与えられたとき、式d(r)は適格 (well-formed) でなければなりません。 | ||
[編集] メンバ関数
新しいunique_resourceを構築する(公開メンバ関数) | |
| 管理しているリソースが存在する場合、それを解放する (公開メンバ関数) | |
unique_resourceを代入する(公開メンバ関数) | |
変更 | |
| 所有権を放棄する (公開メンバ関数) | |
| 管理しているリソースを解放または置換する (公開メンバ関数) | |
監視 | |
| 基底のリソースハンドルにアクセスする (公開メンバ関数) | |
| 管理しているリソースの解放に使用されるデリータにアクセスする (公開メンバ関数) | |
| リソースハンドルがポインタの場合、そのポインタが指す先にアクセスする (公開メンバ関数) | |
[編集] 非メンバ関数
無効値をチェックしてunique_resourceを作成する(関数テンプレート) |
[編集] 推論補助
[編集] ノート
NullablePointer を満たすリソースハンドルの型は、std::unique_ptr によっても管理できます。unique_ptrとは異なり、unique_resourceはNullablePointerを要求しません。
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| (C++11) |
オブジェクトの所有権を唯一のものとするセマンティクスを持つスマートポインタ (クラステンプレート) |