namespace std {
using intptr_t = signed-integer-type;
}
概要
ポインタサイズの符号付き整数型。
この型を実装するかどうかは処理系定義。
この型は、以下の動作が保証される:
- 有効な
void
へのポインタからintptr_t
型への変換 intptr_t
型のポインタ値からvoid
へのポインタへの逆変換- 変換前と逆変換のポインタ値が等値となる
備考
この型は、以下のような用途に使用できる:
- ポインタ値を、一意な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>
にグローバル名前空間で定義されている。
- 2005, 2008では、