再帰的なテンプレート イディオムを使用して、基本クラスのすべての子をファクトリに自動的に登録します。ただし、私の設計では、子クラスはフレンド クラスとして基本クラスを持つ必要があります。私のベースクラスのコンストラクターは、ファクトリ以外でこのクラスのインスタンス化を避けるためにプライベートにする必要があります。
全体的な目的は、ファクトリの登録が BaseSolver で行われ、ChildClasses がファクトリ経由以外でインスタンス化できないことです。
すべての子を SolverFactory に自動的に登録する基本クラスのコードを次に示します。
template<class T>
struct BaseSolver: AbstractSolver
{
protected:
BaseSolver()
{
reg=reg;//force specialization
}
virtual ~BaseSolver(){}
/**
* create Static constructor.
*/
static AbstractSolver* create()
{
return new T;
}
static bool reg;
/**
* init Registers the class in the Solver Factory
*/
static bool init()
{
SolverFactory::instance().registerType(T::name, BaseSolver::create);
return true;
}
};
template<class T>
bool BaseSolver<T>::reg = BaseSolver<T>::init();
そして、ここに私の子クラスのヘッダーファイルがあります:
class SolverD2Q5 : public BaseSolver<SolverD2Q5>{
private:
//how can I avoid this?
friend class BaseSolver;
SolverD2Q5();
static const std::string name;
}
これはうまくいきます。ただし、BaseSolver をフレンド クラスとして追加する必要はありませんが、コンストラクターと静的メンバー名を公開したくありません。
これを回避するためのよりエレガントなソリューションまたはより良いレイアウトはありますか?