サンプルの動作確認バージョン [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
を投げます。
コンストラクタや代入演算子がtemplate
になっていて、
渡されたオブジェクトの型に応じて対応するholderクラスを作り、
それを基底クラスのポインタによってany
の中に保持する、
という実装になっています。かなりシンプルで目から鱗。