boost::any

トップページ > 拡張データ型 >

abstract

必要なヘッダ
<boost/any.hpp>
出来ること
ほぼどんな型でも格納できる動的型変数
リファレンス
en

sample

サンプルの動作確認バージョン [GCC4.4/1.40.0] [VC9/1.40.0]

#include <iostream>
#include <boost/any.hpp>
using namespace std;

struct Point
{
	Point(int ix=0,int iy=0) : x(ix), y(iy) {}
	int x, y;
};

static const char* hw = "hello world.";

int main()
{
	boost::any a, b;
	a = 100; // 整数を入れる
	b = hw;  // 文字列を入れる
	a = b;   // any同士の代入
	b = Point(10,20); // ユーザー定義型でも入っちゃう

	// 値の取り出し
	cout << boost::any_cast<Point>(b).x << endl;
	if( a.type() == typeid(int) )
		cout << "intです" << endl;
	else if( a.type() == typeid(const char*) )
		cout << "文字列です" << endl;

	return 0;
}

出力例

10
文字列です

any_cast は失敗すると bad_any_cast を投げます。

etc

コンストラクタや代入演算子がtemplateになっていて、 渡されたオブジェクトの型に応じて対応するholderクラスを作り、 それを基底クラスのポインタによってanyの中に保持する、 という実装になっています。かなりシンプルで目から鱗。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0