2012-01-09 38 views
2

我想編寫一個函數模板,它可以接受可變數量的模板參數,並打印出類型參數的typeid()。name()。我可以這樣做內部類的模板,使用靜態功能如下:帶有可變參數模板的函數

template<typename...> 
struct foo; 

template<typename H, typename... T> 
struct foo<H, T...> { 
    static void print() { 
    std::cout << typeid(H).name() << ", "; 
    foo<T...>::print(); 
    } 
}; 

template<typename H> 
struct foo<H> { 
    static void print() { 
    std::cout << typeid(H).name() << "\n"; 
    } 
}; 

int main(void) 
{ 
    foo<int, float>::print(); 
    return 0; 
} 

但是,我不能做到以下幾點:

template<typename H, typename... T> 
void print() { 
    std::cout << typeid(H).name() << ", "; 
    print<T...>(); 
} 
int main(void) 
{ 
    print<int, float>(); 
    return 0; 
} 

我嘗試添加下面的「基地」的情況:

template<typename H> 
void print(); 

void print(); 

都沒有工作。我如何編寫這樣的函數模板?

+1

是你得到了什麼錯誤訊息? – templatetypedef 2012-01-09 19:14:26

+0

您的班級模板專業化不明確。 – 2012-01-09 19:48:29

回答

3

FWIW,我可以得到下面的代碼鏘3.1和GCC 4.5.1編譯:

#include <typeinfo> 
#include <iostream> 

template<class T> 
void print(){ 
    std::cout << typeid(T).name(); 
} 

template<typename H, typename T, typename... R> 
void print(){ 
    std::cout << typeid(H).name() << ", "; 
    print<T, R...>(); 
} 

int main(){ 
    print<int, float>(); 
} 
+0

是的,這個工程。我沒有想到,在主要情況下處理2個或更多模板參數,並且在基本情況下處理1個參數是正確的解決方案。我試圖在一般情況下做1個或更多,在基本情況下做0個。主要拿走,至少對我來說,是typename ... A匹配0或更多的參數。 – keveman 2012-01-09 20:51:50

-2

你可以交替做:

void print() {/*...*/} 

template<typename X> void print() {/*...*/} 

template<typename X, typename Y> void print() {/*...*/} 

int main() 
{ 
    print(); 
    print<int>(); 
    print<int,double>(); 

    return 0; 
} 
+1

這不處理超過2個模板參數。 – keveman 2012-01-09 20:52:31

1
template<typename H> 
void print(); 

此次榮獲」因爲它與可變參數重載模糊不清:兩者都可以使用單個模板來調用te論證。

void print(); 

這並不在你的可變參數print工作,因爲你打電話print<T...>它永遠只能匹配print模板,而不是常規的函數(即使T...擴展到一個空的參數列表,該呼叫將被print<>(),不print()

一種解決辦法是改變你的可變參數的情況下只接受至少有兩個參數:

template<typename H, typename T1, typename... TRest> 
void print() { 
    std::cout << typeid(H).name() << ", "; 
    print<T1, T...>(); 
} 

現在您的單參數print模板應該在遞歸的底部正確選擇。

認爲以下應該在C++ 11的工作作爲一個零參數基本情況,但我不能讓GCC 4.6接受它:

template<> void print();