namespace std {
template<class Pointer = void, class Smart, class... Args>
auto inout_ptr(Smart& s, Args&&... args);
}
概要
2重ポインタT**
引数経由で既存リソースを解放してから新規確保リソースへのポインタを返すレガシーC関数に対して、出力されたポインタ値をスマートポインタs
に格納するアダプタinout_ptr_t
を返すヘルパ関数。
リソース占有管理セマンティクスを提供するC++標準スマートポインタstd::unique_ptr
を始め、互換インタフェースをもつ任意のスマートポインタ型Smart
を取り扱える。
説明用のP
型を次のように定義する :
is_void_v<Pointer>
がfalse
ならばPointer
- そうでなければ、
Smart::pointer
が有効な型名であればSmart::pointer
- そうでなければ、
Smart::element_type*
が有効な型名であればSmart::element_type*
- そうでなければ、
pointer_traits<Smart>::element_type*
戻り値
inout_ptr_t<Smart, P, Args&&...>(s, std::forward<Args>(args)...)
備考
スマートポインタアダプタinout_ptr
は、リソース共有管理セマンティクスを提供するstd::shared_ptr
をサポートしない。
これは、共有管理されている既存リソースの所有権を放棄させるインタフェース(release
)を提供しないためである。
例
P1132R8引用
// Legacy C APIs
error_num c_api_re_create_handle(int seed_value, int** p_handle);
void c_api_delete_handle(int* handle);
// C++ program
#include <memory>
struct resource_deleter {
void operator()(int* handle) {
c_api_delete_handle(handle);
}
};
int main() {
std::unique_ptr<int, resource_deleter> resource(nullptr);
error_num err = c_api_re_create_handle(
24, std::inout_ptr(resource)
);
if (err == C_API_ERROR_CONDITION) {
// handle errors
}
// resource.get() the out-value from the C API function
}
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??