2015-03-31 45 views
2

如何定义链接列表的节点模板?我也想保留指针类型作为模板参数,以便我可以将其更改为unique_ptr或shared_ptr取决于可用的内容。如何使用指针作为模板类型定义链接列表节点的模板类

template<typename T, typename NodePtr> 
struct node{ 
    T data; 
    NodePtr parent = nullptr; 
}; 

的问题是,如何启动这个类,这样NODEPTR会shared_ptr < Node <T ,what?> >类型?

+0

为什么不'节点 *父;'?额外的模板参数不是必需的(除非您有充分的理由使用它)。 – PaulMcKenzie 2015-03-31 22:04:06

+0

,因为我可能想使用不同的指针类型,比如说shared_ptr user40129 2015-03-31 22:05:19

+0

@ user40129你绝对不会在列表之间共享节点,所以'std :: shared_ptr'没有意义。你也很可能不会拥有唯一但可转移的节点所有权,所以'std :: unique_ptr'也没有多大意义。 – molbdnilo 2015-03-31 22:29:56

回答

3

的“最简单的”解决方案,我能想到的是一个可变参数模板的模板参数:

template<class T,template<class ...> class PTR_T> 
struct Node { 
    T data; 
    PTR_T<Node> parent{nullptr}; 
}; 

这工作既unique_ptrshared_ptr像此:

Node<int,std::shared_ptr> roots; 
Node<int,std::unique_ptr> rootu; 

作为自己的建议,你就必须引入类型别名,如果你想使用原始指针:

template<class T> using raw_ptr = T*; 
+0

是的,不幸的是,这不适用于'unique_ptr'。 – juanchopanza 2015-04-01 05:25:22

+0

添加此行会。 template using unique_ptr = std :: unique_ptr >;模板使用raw_ptr = T * – user40129 2015-04-01 06:58:20

+0

@juanchopanza:感谢您的收获我总是忘记,uniuque_ptr和共享ptr有不同数量的模板参数。修复。 – MikeMB 2015-04-01 08:29:53

0

你只需要传递参数T

template <typename T> 
struct node 
{ 
    T data; 
    node<T> * parent; 
} 
相关问题