0

型によって構造が変わるデータをツリー構造で管理しようとしています。

これが私がベースオブジェクトに対して行ったことです

//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
}

何か案が?

4

0 に答える 0