可变参数模板,递归,非类型名称参数

时间:2016-11-04 18:35:51

标签: c++ variadic-templates

尝试使用非typename参数构建一些简单的可变参数模板:

  #include <iostream>

  void myf()
  {
  }

  template<int Arg1, int ... Args> void myf()
  {
     std::cout << Arg1 << ", ";
     myf<Args...>();
  }

  int main()
  {
     myf<1,2,3,4,5>();
  } 

尝试编译并得到:

test.cpp: In instantiation of ‘void myf() [with int Arg1 = 5; int ...Args = {}]’:
test.cpp:10:18:   recursively required from ‘void myf() [with int Arg1 = 2; int ...Args = {3, 4, 5}]’
test.cpp:10:18:   required from ‘void myf() [with int Arg1 = 1; int ...Args = {2, 3, 4, 5}]’
test.cpp:15:20:   required from here
test.cpp:10:18: error: no matching function for call to ‘myf()’
     myf<Args...>();
              ^
test.cpp:10:18: note: candidate is:
test.cpp:7:39: note: template<int Arg1, int ...Args> void myf()
     template<int Arg1, int ... Args> void myf()
                                   ^
test.cpp:7:39: note:   template argument deduction/substitution failed:
test.cpp:10:18: note:   couldn't deduce template parameter ‘Arg1’
     myf<Args...>();

看来,递归终止无法正常工作。终止非typename可变参数模板递归的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

正确的解决方案是将最后一个案例作为一个参数案例而不是无参数案例。问题是您的上一次通话扩展到:

// one parameter case:
template<int Arg>
void myf()
{
    std::cout << Arg << std::endl;
}

// two or more parameters:
template<int Arg1, int Arg2, int... Args>
void myf()
{
   std::cout << Arg1 << ", " << Arg2 << ", ";
   myf<Args...>();
}

哪个不太有效。

相反,您可能希望这样做:

{{1}}

以下是construct a sequence

的实例