如何使用可变参数模板处理模板专业化?

时间:2014-03-14 08:33:21

标签: c++ c++11 variadic-templates template-specialization

我有以下代码,

#include <iostream>
#include <tuple>

static inline void print (void)
{
  ;
}

template <typename Head, typename... Tail>
static inline void print (Head h, Tail... t)
{
  std::cout << h << std::endl;
  print(t...);
}

int main(int argc, char *argv[])
{

  print("string", 42, 3.43, true, 'c');

  return 0;
}

有没有办法专门针对第一种类型Head,例如bool?我正在寻找的是我需要做的正确语法。我试过添加这个额外的模板,

template <bool, typename... Tail>
static inline void print (bool h, Tail... t)
{
  std::cout << "I'm a bool!" << std::endl;
  print(t...);
}

无济于事。

2 个答案:

答案 0 :(得分:8)

在C ++中,没有函数模板的部分特化。

对于C ++ 03和C ++ 11来说都是如此,对于所有函数模板都是如此,不仅仅是变量函数模板。

您可以重载该功能:

template <typename... Tail>
static inline void print (bool h, Tail... t)
{
  std::cout << "I'm a bool!" << std::endl;
  print(t...);
}

当第一个参数为bool时,将使用该重载。

答案 1 :(得分:2)

函数重载就足够了,但是你需要先声明所有签名,下面的代码才能运行here,但是如果删除像here那样的bool重载声明,那么它就不会拾取。

#include <iostream>

void print (void){}
template <typename... Tail>
void print (bool b, Tail&&... t);
template <typename Head, typename... Tail>
void print (Head&& h, Tail&&... t);


template <typename Head, typename... Tail>
void print (Head&& h, Tail&&... t) {
  std::cout << std::forward<Heal>(h) << " ";
  print(std::forward<Tail>(t)...);
}

template <typename... Tail>
void print (bool , Tail&&... t) {
  std::cout <<"bool" << " ";
  print(std::forward<Tail>(t)...);
}

int main(int argc, char *argv[]) {
  print("string", 42, true, 3.43, true, 'c');
  return 0;
}

编辑:为真正的解决方案添加了通用参考。