我正在尝试创建一个树结构来管理其结构可能根据类型而变化的数据。
这是我为基础对象做的事情
//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
最终实现可能包含另一种数据类型的Controller:
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
}
有什么想法吗?