2016-08-17 103 views
1

我有一個模板類,像這樣定義的innter類型:如何縮短爲模板類類型名稱語法

template <class T> 
class BinarySearchTree 
{ 
private: 
    struct Node 
    { 
     T m_value; 
     Node* m_left; 
     Node* m_right; 

     Node(const T& value = T(), 
      Node* const left = nullptr, 
      Node* const right = nullptr) 
      : m_value(value) 
      , m_left(left) 
      , m_right(right) 
     { 

     } 
    }; 

public: 
    const Node* find(const T& value) const; 
}; 


template <class T> 
const typename BinarySearchTree<T>::Node* BinarySearchTree<T>::find(const T& value) const 
{ 
// some code here 
} 

因此,有許多功能,包括返回Node*,每次它是很討厭寫typename BinarySearchTree<T>::Node*爲函數返回類型之外的類。有沒有更好的辦法?

+0

如果需要,您可以在C++ 14中使用'auto'。 – Holt

回答

15

使用後返回類型:

template <class T> 
auto BinarySearchTree<T>::find(const T& value) const -> Node* 
{ 
// some code here 
} 

BinarySearchTree<T>::find之後的所有內容均使用該類的範圍進行評估。

這允許您將類的定義放在類的外部,而不使用類型別名來縮短名稱。

+0

非常酷。以前從未想過這件事! +1 – erip

3

您可以引入一個模板別名:

template<typename T> 
using Node = typename BinarySearchTree<T>::Node; 


template <class T> 
Node<T> const* BinarySearchTree<T>::find(const T& value) const 
{ 
// some code here 
return nullptr; 
} 
2

的「明顯」的解決辦法是把函數定義內嵌類,這並不總是一個好主意內。

另一種可能是使用類型別名使用模板和using關鍵字(從C++ 11起支持):

template<typename T> 
using Node = typename BinarySearchTree<T>::Node; 

然後你可以使用(全球)類型的別名Node

template <class T> 
const Node<T>* BinarySearchTree<T>::find(const T& value) const 
{ 
    // some code here 
}