具有可变参数模板的函数

时间:2012-01-09 18:59:07

标签: c++ templates c++11

我想编写一个函数模板,可以使用可变数量的模板参数,并打印出类型参数的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();

都没有奏效。我该如何编写这样的函数模板?

3 个答案:

答案 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;
}
相关问题