CRTP(不思議なことに繰り返されるテンプレートパターン)を使用すると、基本クラスにそれから派生したクラスの知識を提供できます。基本クラスから派生した各クラスのインスタンスを格納する配列を作成することはそれほど難しくありません(例を参照)。
class Base{
public:
static std::vector<Base *> m_derivedInstances;
};
template <class Derived>
class CRTPBase : public Base {
public:
static bool m_temp;
static bool addInstance()
{
m_derivedInstances.push_back(new Derived);
return true;
}
};
template <class Derived>
CRTPBase<Derived>::m_temp = CRTPBase<Derived>::addInstance();
すべてのタイプの派生クラスのタイプリスト( http://www.research.ibm.com/designpatterns/pubs/ph-jun00.pdfを参照)を作成できるかどうか疑問に思いました。問題は、コンパイラがそれから派生する新しいクラスをBase
検出するたびに、リストに新しい型を追加する必要があることですが、タイプリストは不変です(新しい型が追加された新しいリストを作成することは可能ですが、追加する私の知る限り、リストの要素は不可能です。最後に、次のようなものが必要です。
struct DerivedClassHolder {
typedef Loki::TL::MakeTypeList</*list all derived classes here*/>::Result DerivedTypes;
};
最終的な目標は、から派生するすべてのクラスを反復処理できるようにすることBase
です。