2012-01-09 39 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();