我有一个tree_node类和一个树类. templatetypename Tclass tree_node{public: tree_node(const std::string key_, const T value_) : key(key_), value(value_) { }private: T value; std::string key;};templatetypename Tclass tree{public: tree
template<typename T>
class tree_node
{
public:
tree_node(const std::string& key_, const T& value_)
: key(key_), value(value_)
{
}
private:
T value;
std::string key;
};
template<typename T>
class tree
{
public:
tree() : root(new tree_node<T>("", ???)) { }
private:
tree_node<T>* root;
};
tree_node在创建时需要T的实例.我怎么能把它传递给???地点?我可以说T(),但只有当T有一个无参数构造函数时它才会起作用.我不能为tree_node提供无参数构造函数,因为如果T没有无参数构造函数,它将无法编译.
我正在寻找一种方法来设计tree_node,它可以正确地保存所有类型,包括指针类型.
编辑
在尝试了各种方法后,我发现boost :: optional在这种情况下很有用.我可以将T值设为boost :: optional< T>值.这将解决空构造函数问题.所以我可以使用tree_node的另一个构造函数重载,它只需要一个键.这可以由根节点使用.这是正确的方法吗?
谢谢..
Init根值应该为零.如果你推新节点,你显然知道价值.template<typename T>
class tree
{
public:
tree() : root(0) { }
void push (const std::string& key, const T & t) {
if (root == 0) {
root = new tree_node<T>(key, t);
} else {
// Make complex tree
}
}
private:
tree_node<T>* root;
};
加
如果使用后缀树,则应该制作两种类型的顶点:
enum NodeType { EMPTY_NODE, VALUE_NODE };
class base_tree_node
{
public:
base_tree_node() :parent(0), left(0), right(0) {}
virtual NodeType gettype() = 0;
protected:
base_tree_node* parent;
base_tree_node* left;
base_tree_node* right;
};
class empty_tree_node : base_tree_node
{
virtual NodeType gettype() { return EMPTY_NODE; }
}
template<typename T>
class tree_node : base_tree_node
{
public:
tree_node(const std::string& key_, const T& value_)
: key(key_), value(value_)
{
}
virtual NodeType gettype() { return VALUE_NODE; }
private:
T value;
std::string key;
};
