最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

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>`にグローバル名前空間で定義されている。