我正在构建一个二叉搜索树。作为我的通用人,我想允许所有类型都能够充当树中节点的键。
所以我想出了以下内容:
class foo
{
private:
template<class T>
struct node
{
T key;
node* left;
node* right;
};
node<>* _root; //point of interest
public:
//.....
template<class T>
void insert(const T& key);
};
当我将节点插入树中时,我可以根据key
的类型创建节点对象,但我不知道如何以这种方式声明_root
(当在空树上使用insert
,我可以轻松选择_root
)的类型。
我相信C ++ 14的模板变量可以帮助我,但遗憾的是MSVC的编译器尚未实现该功能。
问题:如何以最通用的方式确定_root
?人们过去是怎么做到的?
答案 0 :(得分:3)
只是存储节点不是问题:
class foo
{
struct node
{
virtual ~node() {}
node * left;
node * right;
}
template<typename T>
struct key_node: node
{
T key;
~value_node() {}
}
node *root;
};
当您想要访问节点中的键值时会出现问题(因为您需要以某种方式存储类型信息)。
或者,您可以使用boost :: any而不是T模板:
class foo
{
struct node
{
boost::any key;
node * left;
node * right;
}
node *root;
};
...并使用boost :: any的接口来获取它们的键值(但即使在这里,您可能需要有关存储在任何类型中的类型的信息,然后才能以通用方式访问它)。