2010年7月8日木曜日

リフレクションを実装してみた。

リフレクションをC++で実装してみました。
ただし、名前によるメンバ変数へのアクセスを提供するのみで
本来リフレクションという言葉で定義される全てを満しません。

[サンプルソースのダウンロード]
サンプルソースを更新しました。内容と新しいソースについては
7月10日の記事を確認してください。その記事へジャンプ

ZIPアーカイブにはVisual Studio 2008のプロジェクトファイルと
ソースコードが含まれています。

サンプルはBoost ver.1.43.0を利用しますのでメイクする際には
Boostを落として[ツール >> オプション]あたりでインクルードパスを
通しておいて下さい。

なお、サンプルによって生じたいかなる現象についても責任を
負いかねますのでご了承下さい(単純なソースですけどね)。

以下利用方法を解説します。

まずReflectableクラスを継承したクラスを宣言します。
名前アクセスを行いたいメンバ変数(リフレクト要素)を追加していきます。
class MyObj : public Reflectable
{
public :
  Sample() { registerElements(); }
  ~Sample() {}

private :
  void registerElements();// 解説後述

private :
  Element<int> m_number;// 整数値要素
  Element<Child> m_obj;// 静的配置クラス要素
  Element<Child*> m_pObj;// クラスポインタ要素
};
要素としてクラスを格納する際はそのクラス(この場合はChild)も
Reflectableを継承していなければなりません。

宣言された要素はコンストラクトのタイミングで要素を登録します。
登録はマクロ経由の関数コールで行います。
void Sample::registerElements()
{
  // 以下のマクロは
  // Reflectable::registerElementをコールする
  REGISTER_ELEM( m_number );
  REGISTER_ELEM( m_obj );
  REGISTER_ELEM( m_pObj );
}
あとは次のような記述で名前アクセスが可能です。
Sample sample;
int& n = sample.reflect( "m_number" );// 参照の取得

0 件のコメント:

コメントを投稿