我想编写一个函数模板,可以使用可变数量的模板参数,并打印出类型参数的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();
都没有奏效。我该如何编写这样的函数模板?
答案 0 :(得分:3)
FWIW,我可以使用Clang 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>();
}
答案 1 :(得分:1)
template<typename H> void print();
这不起作用,因为它与可变参数重载不明确:两者都可以使用单个模板参数调用。
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();
答案 2 :(得分:-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;
}