私はここで挑戦の種を持っています。私は将来のプロジェクトのためのエクササイズとユーティリティキットの両方としてリフレクションライブラリに取り組んでいます。それを機能させるためには、私はすでにそれが不可欠であることを容認しました。貴重な反射データを得るためには、クラスのボディに少なくともわずかなコードを追加する必要があります。リフレクションを実装する:クラスの親を見つける方法
しかし、私は可能な限りミニマルスティックになりたいと思います。そこで、いくつかの既存の実装を勉強した後、私に合ったコンセプトを見つけました。単純化するために、パターンは次のようになります。
class Base
{
int baseFoo;
double baseBar[5];
RTTINFO(baseFoo, baseBar);
};
(...)
Base sth;
std::cout << TypeInfo(sth).variables[0].name; << std::endl;
// I don't mind if the way of accessing the type info changes totally
いくつかの一般的なプログラミングを使用して、私はこのRTTINFO
マクロと建物種別情報構造の後ろに好きなものを隠してほとんど達成することができます。私はタイプ、名前、配列のサイズなどを取得することができます。しかし、私はこのように、さらに一歩を行くと継承を紹介したいとき:
class Derived : public Base
{
std::string foo;
char* bar;
/* RTTIPARENT(Base); <-- I want to avoid this */
RTTINFO(foo, bar);
};
私はベースをspecifing避け、まだ入ることができるようにしたいと思いますメンバーのRTTI。 Base
はRTTINFO(...)
のDerived
にいくつかのヒントを密輸して可能にする方法があることを願っていました。だからそこにはありますか?
主な要件は次のとおりです。
- 私は、基本クラスのどこにでもなく、言語定義の場所を指定する必要はありません。そして、私はどのマクロでも
class Derived : public Base
をラップしたくありません。 RTTIINFO
は、影響を受けるクラスに必要な言語とメモリバイアスを追加できます。RTTINFO
マクロに、必要ならば何トンものコードを入れることができます。- BaseとDerivedの両方が、まったく同じ
RTTINFO
マクロを使用します。これは、もちろん、さらにインフェリメンテーションで再利用される可能性があります。多重継承の問題を除外しましょう、単一の継承は十分に複雑に見えます。 Derived
がBase
のRTTIにアクセスする必要はありませんが、RTTIデータを処理する他の外部ヘルパークラス/関数でもかまいません。ただし、プライベートメンバー変数をサポートする必要があります。- 私はコンパイルと実行時のコストを気にしません - 継承ツリーを構築する、既存のすべてのクラスをポーリングするなどの計算が実行時に実行される必要がある場合は、常にプログラムの初期化段階に移動できる方法があります。私にとっては大したことではありません。
- 可能であれば、言語サポートRTTIは、一部のプロジェクトでは無効にする必要があります。とにかく、私はそれでも解決策を見つけられませんでした。
- 追加のコンパイルステップを追加することはできません。
ワンノート:たぶん私はを使用することができますが、それは一般的なコンパイラのために働くだろうしても、C++標準では、私がここに継承関係に頼ることはできないと言います。
ありがとうございました!
アンドリュー
マクロで現在のクラス名を取得するにはどうすればよいですか? –
Reflectionはチェーンソーが歯科医の練習に属するほどあなたのC++の "ユーティリティキット"に属します。 –
正確には、あらゆる種類のリフレクション/タイプ情報が必要な場合は、非常に多くのマクロで終わることになり、有用ではありません。ちょうどGObjectを見てください。 – farnoy