2011-01-07 60 views
1

假設我有很多類與他們的「* Pack」對應的命名。例如,如果我有Moo班,我有MooPack,如果我有Foo,我也有FooPack。Stringify和Unstringify模板參數

我想有一個C++模板函數,它從一個Foo

template <class X, class XPack> 
XPack packify(X input){ 
    ... 
} 

是否有可能做到這一點返回FooPack而不必指定模板參數?目前,這必須像做了以下內容:

Moo moo; 
MooPack mooppey = packify<Moo, MooPack>(moo); 

如果只需要哞模板參數,那個醜陋的模板規範位可以使用#定義走開,但除了,這是不是真的最好的解決方案要麼仍然不這樣做。

有沒有辦法,或者我會不得不等待C++ 0x?

回答

5

你不必指定Moo,只是MooPack,因爲moo會爲你推導出你的論點。不過,我建議你在Moo內部使MooPack成爲typedef或嵌套類(稱爲包),在這種情況下,可以通過模板中的typename X :: Pack輕鬆訪問它。

class Moo { 
public: 
    class Pack { 
     ... 
    }; 
}; 
template<typename T> typename T::Pack packify(T t) { 
    ... 
} 

// usage 

Moo m; 
Moo::Pack p = packify(m); 
+0

啊是的,我認爲只指定一個參數實際上是可以接受的(兩個參數看起來很醜)。嵌套類是一個好主意,但是我無法改變現有的類聲明。 – kamziro 2011-01-07 13:28:11

1

正如DeadMG答案已經提到的,你不需要明確地指定參數類型,因爲它可以automaticaly推斷(如果是第二個,而不是第一個模板參數)。既然你說你不能改變的類型聲明形成的類之間的聯繫,我會提出特徵路線爲(認爲的std :: iterator_traits):

template<typename T> struct pack_traits; 
template<> struct pack_traits<Moo> { typedef MooPack Pack; }; 
...//traits for other packifable classes 

template<typename T> pack_traits<T>::Pack packify(T val){...} 
... 
Moo moo; 
MooPack mooppey = packify(moo); 

這樣你就可以調用函數不手動指定模板參數,而不需要自己修改類。