最終更新日時(UTC):
が更新

履歴 編集

function template
<memory>

std::inout_ptr(C++23)

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

処理系

関連項目

参照