我正在尝试创建一个树结构来管理其结构可以根据类型而改变的数据。
这是我为基础对象所做的
//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;
}
};
树的第二层如下所示:
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
}
任何想法?