2015-12-07 185 views
0

我正在构建一个二叉搜索树。作为通用人员,我希望允许所有类型都能够充当树中节点的密钥。替代模板变量?

于是我想出了以下内容:

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?人们过去如何做到这一点?

+3

你是过度概括。请将作为foo的模板参数,因为无论如何,您的节点只能属于某个类型。 – SergeyA

+0

澄清:你想要一个*单个树*能够拥有多种不同类型的密钥? – immibis

+1

你有没有想过如何实现这一点?如果你不知道它们的类型,应该如何比较密钥等?请记住,编译时需要知道类型。 – Kevin

回答

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 ::任何,而不是一件T模板:

class foo 
{ 
    struct node 
    { 
     boost::any key; 
     node * left; 
     node * right; 
    } 

    node *root; 
}; 

...和使用升压的接口::任何让他们键的值(但即使在这里你可能需要有关存储在任何类型中的信息,然后才能以通用方式访问它)。

+1

其实问题出现在尝试从节点访问密钥之前。第一个问题出现在您需要比较键以正确的顺序插入它们时。 –

+0

这可以用[std :: hash](http://en.cppreference.com/w/cpp/utility/hash)来解决, – utnapistim