2015-09-06 52 views
0

假設我們有一個矩陣模板類的實現。 我希望用類型的std::vector來表示矩陣。模板類和信息隱藏的迭代器

現在,我希望通過返回矢量的迭代器來返回矩陣的迭代器。對於這一點,我看到使用關鍵字typenamepublic部分是必需的:

typedef typename std::vector<T>::iterator iterator. 

首先,爲什麼這裏需要typename我不明白。

其次,大家可以看到我用std::vector來表示矩陣。 我能做些什麼來防止信息暴露。

如何在不暴露矩陣表示的情況下實現此目標?

+0

對於你的第一個問題:http://stackoverflow.com/questions/7923369/when-is-the-typename-keyword-necessary – Mat

回答

0

首先,我不明白爲什麼typename包含在這裏。

typename告訴編譯器iterator確實是一個類型,而不是一個成員,例如,這看起來完全一樣。您在處理模板時需要對此進行限定,因爲一般情況下,編譯器沒有足夠的信息來說明差異。

其次,每個人都可以看到我使用矢量來表示矩陣,我該怎麼做才能防止信息暴露。

儘管每個人都可以看到您正在使用矢量,但這不是商業祕密。你提供了一個供外界使用的typedef,強調vector只是一個實現細節,如果他們不這樣做,我認爲他們應該得到一切。

爲了強調這一點,vector<T>::iterator也是一個typedef,在一些編譯器中,當你用不同的標誌編譯時,它意味着不同的事情。有時你可以查找並在任何地方使用T*,但是當代碼最終破裂時,你真的會對標準庫的開發者抱怨嗎?

我不認爲你可以更好地隱藏它:編譯器需要知道迭代器是什麼。

0

您需要包括typename這裏,因爲有是推斷類型,T,存在。這已被問及回答here

對於第二個問題,你並沒有在這裏暴露類的表示;您的班級的用戶不需要需要瞭解爲了使用您的班級,基礎Matrix表示是std::vector。這些信息實際上只有在用戶努力尋找它時纔可用(例如,通過編譯錯誤)。即使你定義了你自己的迭代器,用戶仍然可以看看你的源代碼。

最後,如果你使用的是C++ 11,做同樣的事情的一個更好的辦法是使用別名:

using iterator = typename std::vector<T>::iterator; 

沒有直接的優勢,在這種情況下,但良好的進入這個習慣。