替代模板变量?

时间:2015-12-07 21:24:44

标签: c++ templates c++11 c++14

我正在构建一个二叉搜索树。作为我的通用人,我想允许所有类型都能够充当树中节点的键。

所以我想出了以下内容:

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?人们过去是怎么做到的?

1 个答案:

答案 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的接口来获取它们的键值(但即使在这里,您可能需要有关存储在任何类型中的类型的信息,然后才能以通用方式访问它)。