2012-05-16 50 views
0

今天我遇到了一個可怕的問題。 我一直在使用可變參數模板來處理整個框架。事實證明,我正在使用的那個人使用visual studio,它還不支持可變模板。MSVC的可變模板

我試圖通過使用宏無縫地移植功能,但經過長時間的工作,它看起來像是不可能的。 問題是模板的參數數量可能會從零變化到四(或使用可變參數模板變爲無窮大)。

即使我的宏製成,並且花費在這樣的事情:

template<> 
Signal<void()> 
{ 
// My class 
}; 

template<typename param1> 
Signal<void (param1)> 
{ 
// My class 
}; 

但問題是,它看起來像這樣不使用GCC的(所以我假設它不會與vc一樣)。

頭不顯示任何錯誤,但如果我嘗試實例化的類是這樣的:

Signal<> mySignal; 

我得到這些樣的錯誤:

error: wrong number of template arguments (0, should be 1) 

因爲我覺得沒有信息關於這個問題,我至少想知道我正在嘗試的是否可能? 或者如果我真的要再次寫數百行代碼,因爲微軟認爲variadic模板不夠重要?

+0

「Microsoft不認爲可變模板足夠重要嗎?」微軟認爲他們很重要。他們嘗試過,但未能讓他們進入VS11。 – bames53

+1

如果您正在編寫信號框架(如在信號事件中),請考慮將已有的庫用作'boost :: signal'或'boost :: signal2'。 –

回答

2

你不能有一個沒有參數的模板,你的問題的常用方法是使用void或任何其他佔位符。請注意,由於要模擬函數樣的對象,你也許可以通過使用單一類型,它是一個函數簽名簡化這個:

Signal< void() > 

這樣,總有一個模板參數,你只需要提供模板,其中籤名具有0到4個參數情況下的特例:

template <typename S> 
struct Signal; 

template <typename arg1> 
struct Signal<void (arg1)> { ... }; 
template <typename arg1, typename arg2> 
struct Signal<void (arg1,arg2)> { ... }; 

如果你正在建設一個信號/處理器或事件庫,我建議你看看現有的實現。例如,考慮使用或至少查看boost信號/信號庫中的代碼。


頭不顯示任何錯誤,但如果我嘗試實例化的類是這樣的:

Signal<> mySignal; 

的問題是,你的模板只有一個參數,即是一個函數簽名,但是你沒有提供任何參數。在實例化處,您需要需要來提供模板參數。您可能的意思是:

Signal<void()> mySignal;