如何避免嵌套模板中重复的模板参数

时间:2018-09-05 00:32:31

标签: c++ templates

我有一个模板化的BST类和一个节点结构,如下所示:

template <typename T>
struct Node {

    T value;
    Node* left;
    Node* right;
};

template <typename Node, typename T>
class BST {

public:

    Node* m_root;

public:

    BST() {
        m_root = NULL;
    }

    bool find(T value, Node** parent, Node** location) {/* ... */}
}

我需要了解BST类内部结构的模板参数,并按如下所示实例化BST:

BST<Node<int>, int>* bst = new BST<Node<int>, int>();

有点丑。

我想要

BST<Node<int>>* bst = new BST<Node<int>>();

并从struct template参数推导出BST中的T template参数。

我尝试了template < template<typename T> class Node>似乎无效({{1}声明中未知T)。

4 个答案:

答案 0 :(得分:3)

您有几种可能性:

  • 更简单,我想您想要的是

    template <typename T>
    class BST {
    public:
        Node<T>* m_root = nullptr;
    
    public:
        BST() = default;
    
        // ...
    };
    

    随用法

    BST<int> bst;
    
  • 另一个是专业化:

    template <typename T> class BST;
    
    template <typename T>
    class BST<Node<T>> {
    public:
        Node<T>* m_root = nullptr;
    
    public:
        BST() = default;
    
        // ...
    };
    

    用法:

    BST<Node<int>> bst;
    
  • 和最后一个模板模板参数:

    template <template <typename> class N, typename T>
    class BST {
    public:
        N<T>* m_root = nullptr;
    
    public:
        BST() = default;
    
        // ...
    };
    

    随用法

    BST<Node, int> bst;
    

答案 1 :(得分:2)

您可以将主模板更改为仅使用一个模板参数,并添加部分说明。

template <typename T>
class BST;

template <template <typename> class C, typename T>
class BST<C<T>> {
    using Node = C<T>;
public:
    BST() {
        m_root = NULL;
    }

    bool find(T value, Node** parent, Node** location) {/* ... */}
};

然后您可以像使用它

BST<Node<int>>* bst = new BST<Node<int>>(); // deduce C as Node, T as int

或添加一些嵌套的typedef。

template <typename T>
struct Node {
    using value_type = T;
    ...
};

template <typename Node>
class BST {
    using T = typename Node::value_type;
    ...
};

答案 2 :(得分:2)

为什么不只是

template <typename T>
class BST {

public:

    Node< T >* m_root;

public:

    BST() {
        m_root = NULL;
    }

    bool find(T value, Node< T >** parent, Node< T >** location) {/* ... */}
};

答案 3 :(得分:1)

您应将Node嵌套在BST内:

template <typename T>
class BST
{
public:
    struct Node
    {
        T value;
        Node* left;
        Node* right;
    };

    BST() { m_root = NULL; }

    bool find(T value, Node** parent, Node** location) {/* ... */}

private:
    Node* m_root;
};