2013-05-30 22 views
2

我正在使用一個struct的地方作爲聲明:有沒有辦法使用默認的模板參數,而不必在C++中使用<>?

struct Foo 
{ 
someArray[64]; 
//...other stuff 
}; 

它在許多地方廣泛使用,我想將它改成這樣:

template <size_t N = 64> 
struct Foo 
{ 
someArray[N]; 
//...other stuff 
}; 

,因爲有一個地方(以及4是精確的),其中這個結構需要與128字節數組的正確性被使用,但它引入了對於所有的其它用途罰不值得付出。在提供一個默認的模板參數,我希望它會穿過透明的,除了那些在訣竅誰需要一個更寬的內部數組,那麼這將宣告Foo<128>。不幸的是,它似乎強制它的每一次使用都說Foo<>。有沒有解決的辦法?

回答

4

實例化一個類模板時,您不能省略尖括號。

但是,你可以給一個不同的名稱,您Foo類模板(比如FooN),然後提供一個類型別名,如:

typedef FooN<> Foo; 

這樣一來,誰用原來的客戶,非的Foo模板版本將不會改變,並且需要覆蓋默認N可以使用通用類模板的靈活性客戶:

FooN<128> obj; 
2

要首先回答的問題:沒有沒有辦法使用它沒有<>。但是,這並不意味着你不能做其他事情來保持你的代碼庫的完整。

最簡單的解決方法是模板變種重命名爲別的東西和名字Foo提供一個typedef:

template <size_t N = 64> 
struct GenericFoo 
{ 
someArray[N]; 
//...other stuff 
}; 
typedef GenericFoo<64> Foo; 

這樣你就可以使用Foo保持所有其他實例,並有使用GenericFoo<Whatever>的選項當你需要細粒度控制時。

0
namespace generic 
{ 
    template <int N> class Foo {}; 
} 

// user code 

typedef generic::Foo<64> Foo; // common users 

// OR 

using generic::Foo; // rare users 
相關問題