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; 
} 
相關問題