型によって構造が変わるデータをツリー構造で管理しようとしています。
これが私がベースオブジェクトに対して行ったことです
//Type1.. are the types of the leaves having Base as common parent
enum class EnumBase{Type1,Type2,Type3};
class Base {
protected:
EnumBase const _type;
Base(EnumBase typ) : _type(typ){}
public:
virtual ~Base() = default;
Base() = delete;
EnumBase getType() const {return _type;}
};
これは異なる派生物を作成して取得することです
template<class Leaf>
class Controller {
private:
std::shared_ptr<Leaf> _pt;
public:
template<class Derived>
void create() {
_pt = std::make_shared<Derived>();
return;
}
template<class Derived>
Derived & get(){
auto pt = std::dynamic_pointer_cast<Derived>(_pt);
if(!pt){
throw; //bad cast
}
return *pt;
}
};
ツリーの 2 番目のレベルは次のようになります。
enum class Type1Types{T1,T2};
class Type1 : public Base {
protected:
Type1Types const _type;
Type1(Type1Types typ) : Base(EnumBase::Type1), _type(typ){}
public:
virtual ~Type1() = default;
Type1() = delete;
Type1Types getType() const {return _type;}
};
class Type2; //...the same with EnumBase::Type2 and Type2Types
class Type3; //...the same with EnumBase::Type3 and Type3Types
おそらく別のデータ型のコントローラーを含む可能性のある最終的な実装を使用します。
class T1 : public Type1 {
public:
T1() : Type1(Type1Types::T1) {}
//... data of T1
};
class T2 : public Type1 {
public:
Controller<Type2> objType2;
//... other data for T2
};
このすべての背後にあるアイデアは、次のように書くことができるということです。
int main(){
Controller<Type1> obj;
obj.create<T2>();
obj.get<T2>().objType2.create<somethinginType2>();
//...
}
おそらく、そのようなパターンは非常に複雑です (コメントや提案を歓迎します) が、パターンは存在し、いくつかのテンプレート マジックといくつかの再帰を使用して、葉の一般的なテンプレート バージョン (Type1、Type2、..) を作成できると考えています。コードをコピーして貼り付ける必要はなく、子の列挙型 (Type1Types) とそれ自体の型 (EnumBase::Type1) のみを変更します。
私はいくつかの構造を考えていました
template<class Me, class... Parents>
struct MagicStructure{
//some typedef
//my type
}
何か案が?