簡體   English   中英

MSVC的可變模板

[英]Variadic Templates with MSVC

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

我嘗試使用宏無縫地移植該功能,但經過長時間的工作,它看起來不可能。 問題是模板的參數數量可能在0到4之間變化(或使用可變參數模板變為無窮大)。

即使我的宏被制作,並在這樣的事情上花費:

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)

由於我沒有找到關於這個主題的信息,我至少想知道我正在嘗試的是否可行? 或者,如果我真的要再寫幾百行代碼,因為微軟認為可變參數模板不夠重要?

您不能擁有沒有參數的模板,您的問題的常見方法是使用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信號/信號2庫中的代碼。


標頭沒有顯示任何錯誤,但如果我嘗試像這樣實例化類:

Signal<> mySignal;

問題是您的模板采用單個參數,即函數簽名,但您不提供任何參數。 在實例化時,您需要提供模板參數。 你可能意味着:

Signal<void ()> mySignal;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM