2010-02-10 79 views
5

我有一個模板類C++模板的typedef

template <T> 
class Example 
{ 
... 
}; 

內部有 是以下類型的許多方法:

template <class U> <class V> method(....) 

裏面這些我使用TR1 :: shared_ptr的以U或V或T.

它繁瑣的打字tr1::shared_ptr<const U>tr1::shared_ptr<const V>

顯而易見的事情:

template <typename U> 
typedef tr1::shared_ptr<U> shptr<U>; 

不起作用。

你在這種情況下做什麼?任何可以減少冗長的東西?

+1

Duplicates:http://stackoverflow.com/questions/562209/typedef-std-containers,http://stackoverflow.com/questions/1474417/typedef-a-template-class-without-specifying-the-template -parameters,http://stackoverflow.com/questions/544842/c-typedef-ing-stl – 2010-02-10 18:39:57

+0

我不知道他們是重複的,他們肯定是相關的,並可能有興趣瀏覽答案,但確切的重複? – 2010-02-10 20:15:59

回答

9

您可以使用一個內型:

template <typename U> 
struct sptr { 
    typedef tr1::shared_ptr<U> t; 
}; 

然後說sptr<U>::t,還是不幸往往typename sptr<U>::t

的C++ 0x有模板的typedef,你可以檢查你的編譯器是否可以被說服接受他們:

template<typename U> 
using sptr = tr1::shared_ptr<U>; 

然後說sptr<U>

當然還有總是#define sptr ::tr1::shared_ptr,例如,如果您預計將來會出現C++ 0x,並希望彌補差距。或者,如果你在一個足夠狹窄的環境中使用它,宏不是可怕的。

+0

內部類型很好,但它很難使代碼更加冗長...... – UncleBens 2010-02-10 17:37:43

+0

那麼,它在你不需要'typename'的上下文中會有一點點。否則,不,對於'tr1 :: shared_ptr '這樣短的內容來說並不好。如果它是需要縮寫的'std :: vector > :: const_iterator',那麼我們可能會在業務中:-) – 2010-02-10 17:41:17

1
using tr1::shared_ptr; 

應允許您使用shared_ptr沒有前綴,但這是我所知道的。抱歉。

+1

由於我的模板化定義和聲明必須在頭文件中,這是否違反了不應該在頭文件中使用 有使用聲明的規則? – user231536 2010-02-10 17:45:20

+0

@ user231536:我不明白爲什麼它需要放在頭文件中,你可以把它放在源文件中?它必須在所有源文件中完成,但是會減少混亂。 – falstro 2010-02-10 20:45:03

2

沒有什麼可以減少冗長(除了什麼獐鹿說)。

但問題本身的好文章:Template Typedef

你真的需要這一招,如果你有一些通用的功能預計你的類型有一定的相關類型定義,和你的類型是模板(假設您擁有提供result_t,它應該是你的模板參數! )。