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

履歴 編集

type-alias
<cstdint>

std::intptr_t(C++11)

namespace std {
  using intptr_t = signed-integer-type;
}

概要

ポインタサイズの符号付き整数型。

この型を実装するかどうかは処理系定義

この型は、以下の動作が保証される:

  1. 有効なvoidへのポインタからintptr_t型への変換
  2. intptr_t型のポインタ値からvoidへのポインタへの逆変換
  3. 変換前と逆変換のポインタ値が等値となる

備考

この型は、以下のような用途に使用できる:

  • ポインタ値を、一意なIDとして使用する
    • ポインタ値はオブジェクトごとに一意であるため、そのような用途に使用できる
  • コールバック関数に渡す引数として、任意のオブジェクトを設定する

#include <cstdint>
#include <iostream>

// 整数型ひとつをコールバック関数の引数として渡せるAPI
void callback_api(void(*callback)(std::intptr_t), std::intptr_t arg)
{
  callback(arg);
}

struct X {};

void on_call(std::intptr_t arg)
{
  // パラメータで渡される整数値を、元のX*に逆変換する
  X* x = reinterpret_cast<X*>(arg);
  delete x;

  std::cout << "on_call" << std::endl;
}

int main()
{
  int value = 42;

  // value変数へのポインタを、整数値として保持する
  std::intptr_t pointer_value = reinterpret_cast<std::intptr_t>(&value);
  std::cout << std::hex << "0x" << pointer_value << std::endl;

  // コールバック関数の引数として、オブジェクトへのポインタを整数値に変換して渡す
  X* x = new X();
  callback_api(on_call, reinterpret_cast<std::intptr_t>(x));
}

バージョン

言語

  • C++11

処理系

  • Clang: 3.2
  • GCC: 4.3.0
  • ICC: ??
  • Visual C++: 2010, 2012, 2013
    • 2005, 2008では、<stdlib.h>にグローバル名前空間で定義されている。