最終更新日時:
が更新

履歴 編集

function
<memory>

std::pointer_tag_pair::from_tagged(C++29)

static pointer_tag_pair from_tagged(tagged_pointer_type p) noexcept; // (1) C++29

概要

タグを下位ビットへ埋め込んだままの生のポインタ値から、pointer_tag_pairオブジェクトを復元する。

tagged_pointer()の逆操作であり、既存のポインタタギング実装との相互運用のために提供される。

戻り値

  • pが、互換な特殊化のオブジェクトspsp.tagged_pointer()と等値である場合、spと同じポインタ値・タグ値を持つオブジェクトを返す
  • そうでない場合、ポインタ値とタグ値は未規定となる

例外

投げない。

備考

  • 復元の保証は、元のspのポインタのアライメントとタグのビット数が、復元先の特殊化のbits_requestedと両立する場合にのみ与えられる
  • 未検証の値からの復元は誤った結果になりうる危険な操作であるため、意図が目立つよう、独立した冗長な名前の関数として提供される

#include <memory>
#include <iostream>

// ユーザーデータをvoid*で受け渡す、既存のC形式のAPI
void invoke_callback(void (*callback)(void*), void* user_data)
{
  callback(user_data);
}

void on_event(void* user_data)
{
  // 受け取った生のポインタ値から、ポインタとタグを復元する
  auto p = std::pointer_tag_pair<int*, 1, bool>::from_tagged(user_data);

  if (p.tag()) {
    std::cout << "urgent: " << *p.pointer() << std::endl;
  }
  else {
    std::cout << "normal: " << *p.pointer() << std::endl;
  }
}

int main()
{
  int value = 42;

  // 「緊急かどうか」をポインタの下位1ビットに埋め込んで、
  // void*ひとつだけを渡せるAPIへ追加の情報を持ち込む
  std::pointer_tag_pair<int*, 1, bool> p{&value, true};
  invoke_callback(on_event, p.tagged_pointer());
}

出力

urgent: 42

バージョン

言語

  • C++29

処理系

参照