namespace std {
template<class Pointer = void, class Smart, class... Args>
auto
inout_ptr(Smart& s, Args&&... args); // (1) C++23
template<class Pointer = void, class Smart, class... Args>
constexpr auto
inout_ptr(Smart& s, Args&&... args); // (1) C++26
}
概要
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++: ??