2011-06-23 31 views
2

我不熟悉C++ 0x。我在6個月前剛剛開始學習C++,但我仍然有很強的把握(對於初學者)。這是我想使用「使用」的情況嗎?

我有一個模板類:

template <typename T> 
class Node 
{ 
    ... 
} 

後來的後來,我有這樣的:

template <typename T> 
class BinaryTree 
{ 
    protected: 
     typedef Node<T>* node_t; 
    ... 
} 

這裏,二叉樹類被作爲「基礎類」,可以通過延長二叉樹的專業化。 (AVL樹,紅黑等)節點typedef是受保護的,因爲這個想法是專業化可以使用它......而且他們可以,但它看起來很糟糕。

例如,在我的BiTree類(我的創作名稱爲最通用的二叉樹,基本上是BST),我們有這樣的:

template <typename T> 
class BiTree : public BinaryTree<T> 
{ 
    private: 
     typedef typename BinaryTree<T>::node_t node_t; // Yuck 
    ... 
} 

更糟糕的是,我的那些人之一誰喜歡的一類外指定的功能,所以當我想說的是node_t返回類型......好吧,看看...

template <typename T> 
typename BiTree<T>::node_t 
BiTree<T>::insert(BiTree<T>::node_t& node, T data) 
{ 
    ... 
} 

有沒有辦法只是node_t使用?這就是從基類繼承typedef的重點。這是C++ 0x中using關鍵字的用途嗎?我將如何將其應用於這種情況?謝謝。

編輯:我想知道,如果它是有用的原因是因爲這個問題:C++ template typedef

+0

'using'在C++ 0x中不是一個新功能,所以你想使用什麼語法?它確實通過模板化的typedef得到了回收,但我不確定這是否適用於此[雖然我不記得它們是如何被使用的,所以也許我錯了]。 –

+0

=(我想知道它是否適用,因爲人們在談論模板typedefs並使用[here](http://stackoverflow.com/questions/2795023/c-template-typedef) – LainIwakura

+0

那麼,它可以用作模板typedef(實際上這是C++ 0x中的新用法),但它不會與你所擁有的任何不同,它只有幫助你想保留一個或多個模板參數但不是全部的typedef。 – Xeo

回答

8

您的問題的答案是否定的,不適用。 using在上下文中,您的意思是在保留其模板化特性的同時重命名模板類型。你有一個特定的模板實例,所以它不合適。

但是,您的部分關注似乎只是BiTree<T>::在您的函數定義中的過多。對我來說這似乎並不壞;你習慣於看到這樣的結構。但如果你願意,它可以減少。

你開始使用什麼:

template <typename T> 
typename BiTree<T>::node_t BiTree<T>::insert(BiTree<T>::node_t& node, T data) 
{ ... } 

首先,一旦你的名字的功能,你已經「內部」類BiTree<T>,所以編譯器會往裏它類型的參數。

template <typename T> 
typename BiTree<T>::node_t BiTree<T>::insert(node_t& node, T data) 
{ ... } 

的C++ 0x的另一項新功能是等待聲明函數的結果,直到後聲明它的參數的能力。它適用於結果類型取決於參數類型的情況,但同樣適用於上述原因。編譯器會分析它,當內BiTree<T>考慮類型:

template<typename T> 
auto BiTree<T>::insert(node_t& node, T data) -> node_t 
{ ... } 

幾乎沒有重複。你可以在技術上走一步:

template<typename T> 
auto BiTree<T>::insert(node_t& node, T data) 
    -> std::remove_reference<decltype(node)>::type 
{ ... } 

現在,你甚至不重複的參數類型,但得到的返回類型正確是明顯更加困難[證明的事實,我錯了最初得到它; - )]。

+0

我只是想在你的彈出窗口中編輯我的答案中的結尾返回版本。 +1:P – Xeo

+0

即將發佈此準確:) –

+0

正是我想要的!非常感謝你。我不介意打字,但我有一種感覺,我的感覺太過分了。 – LainIwakura

1

埃姆...基類的typedef是沒有任何騙人把戲派生類,您只需使用node_t(雖然_t is a bad suffix ,所有以它結尾的名字都由POSIX標準保留)。但我想知道,如果你想從insert返回這樣一個節點,你爲什麼要這樣做protected/private?應該如何使用它,因爲班級以外的人不能使用node_t

+0

Everything在節點類中是公共的,只有typedefs是protected/private。人們可以訪問正在返回的東西。你可以查看完整的代碼[這裏](https://github.com/LainIwakura/DataStructures) – LainIwakura

+0

我不記得任何關於'_t'的標準都是保留的 - 事實上'wchar_t'是以人們使用的prestandard typedefs最常見的名字命名的,但我可能是錯誤的! –

+0

@Simon:我知道它是由標準保留的,但不是正好b哪個。一點搜索讓我看到了我編輯的鏈接 - 它是POSIX。 – Xeo

相關問題