我有一个模板化的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
)。
答案 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;
};