2008-08-25 60 views
70

C++ 0x有模板別名(有時稱爲模板typedefs)。請參閱here。目前的C++規範沒有。Template typedefs - 你的工作是什麼?

你喜歡用什麼工作?容器對象還是宏? 你覺得它值得嗎?

+3

前段時間,GOTW處理了這個話題:http://www.gotw.ca/gotw/079.htm – 2008-09-16 11:27:56

回答

102

你喜歡用什麼工作?容器對象還是宏?你覺得它值得嗎?

的規範的方式是使用一元函數像這樣:

template <typename T> 
struct my_string_map { 
    typedef std::map<std::string, T> type; 
}; 

// Invoke: 

my_string_map<int>::type my_str_int_map; 

這在STL(allocator::rebind<U>),並且在許多庫,包括升壓也可使用。我們廣泛使用它在bioinformatical library

它膨脹,但它是99%的時間最好的選擇。在這裏使用宏是不值得的許多缺點。

(編輯:我已經修改了代碼,以反映升壓/ STL約定在他的評論中指出,由Daniel)

+3

如果您使用'type'而不是'Type'(或除此之外),這會更好地與Boost.MPL。這可能是有用的,所以我認爲這是一個很好的鼓勵公約。 – 2008-09-16 11:44:51

+0

這真的叫做元函數嗎?我對此表示懷疑。 – 2011-01-24 01:58:52

10
template <typename T> 
struct my_string_map : public std::map<std::string,T> 
{ 
}; 

你不應該不類繼承有一個虛擬析構函數。它與派生類中的析構函數在它們應該被調用時沒有被調用有關,並且最終可能導致未分配的內存。

這就是說,你可能會*****在上面的例子中脫身,因爲你沒有添加任何更多的數據到你的派生類型。請注意,這不是一個認可。我仍然建議你不要做到這一點。事實上你可以做到這一點並不意味着你應該

編輯:是的,這是對ShaChris23的帖子的回覆。我可能錯過了一些東西,因爲它出現在他/她的消息之上而不是下面。

0

有時你可以明確地寫出所有必要類型的無模板typedefs。如果基類在多個模板參數上模板化,並且只有一種類型需要進行typedefed,則可以繼承一個特殊的類,該類中有效包含在繼承類名中的typedef。這種方法不如元函數方法那麼深奧。