我寫一個使用可變參數爲模板的功能,像這樣一個圖書館:的可變參數模板顯式實例化功能
template<typename ... T>
void func(T ... args) {
// ...
}
我需要確保在該函數中生成的代碼(即顯式實例化)的某些類型,像這樣:
template class func<int>;
template class func<int, int>;
template class func<int, int, int>;
// ...
其中int
參數的最大數是一個非const maxArgs()
(我無法改變這個,因爲它是一個外部函數)。我試過以下內容:
template<typename ... T>
void f(size_t max, T ... args) { // Generates "infinitely"
if (sizeof...(T) < max) {
func(args...);
f(max, args..., 0);
}
}
int main(int argc, char** argv) {
f(maxArgs(), 0);
// ...
return 0;
}
但是,編譯器對函數生成遞歸沒有適當的基本情況,所以無法編譯。我已經使用非類型模板,像這樣(使用一些代碼here)也試過:
template<int ...> struct seq { };
template<int N, int ... Ns> struct gens : gens<N-1, N-1, Ns...> { };
template<int ... Ns> struct gens<0, Ns...> { typedef seq<Ns...> type; };
std::vector<int> params;
template<int ... Ns>
void f(seq<Ns...>) {
test(std::get<Ns>(params)...);
}
void instantiate(size_t max) {
for (int i = 1; i < max; ++i) {
for (int j = 0; j < i; ++j) {
params.push_back(0);
}
f(typename gens<i>::type()); // Fails to compile -- i is not const
params.clear();
}
}
int main(int argc, char** argv) {
instantiate(maxArgs());
}
但這需要一個常量的值,所以無法編譯爲好。有沒有辦法正確地做到這一點,不知道maxArgs()
的返回值?
鑑於這可能是不可能的,編譯器(特別是gcc)如何使用省略號和va_list處理C風格變量參數函數的代碼生成?例如:'void func(int a,...){...}' – 2014-09-06 08:55:53