无法理解这个可变参数模板示例

时间:2016-04-09 21:31:09

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

在尝试理解可变参数模板的概念时。我遇到了这个例子。这对我来说似乎是一个简约的例子。

.style('fill', 'white'); 

现在上述程序的输出是:

void output()   --------->function A
{ cout << "This is the results\n"; }

template <typename T, typename ...P> 
void output(T t, P ...p)  ------->functionB
{
  cout << t << ' ';
 { 
     output(p...); ------>statement A
 }

}


//Test it
int main()
{
  output('5', 2);

  return(0);
}

以下是我对此示例的一些问题:

1)A语句是什么?它是在调用函数A吗?但它似乎只调用一次?此方法的签名中没有任何参数?我是如何在上面的示例中将5 2 This is the results 作为输出

2)当作者声明可变类是递归的,因此它们需要基类时,这是什么意思

2 个答案:

答案 0 :(得分:1)

让我们将您的示例更改为:

int g = 0;

void output() { cout << "This is the results\n"; }

template <typename T, typename ...P>
void output(T t, P ...p)
{
  cout << "\n\tg = " << g++ << endl;
  cout << t << ' ';
  {
    output(p...);
   }
 }

输出将是:

g = 0
5 
g = 1
2 This is the results

所以当你调用输出时(&#39; 5&#39;,2); 编译器将生成以下代码:

void output(char c, int x)
{
   cout << c << ' ';
   output(x);
}

然后它会以递归方式&#34;生成函数:

void output(int x) {
   cout << x << ' ';
   output();  
}

对于已经定义的基本情况&#34; void output()&#34;:

void output() { cout << "This is the results\n"; }

因此编译器将使用它而不是从模板生成代码。

答案 1 :(得分:1)

  

1)A语句是什么?它是在调用函数A吗?但它   似乎只调用一次?此方法也没有   签名中的参数?我怎么得到5 2这是结果   上面的例子作为输出

当你调用这样的函数时:

output('5', 2);

t == '5'...p将是其余参数,仅2

void output(T t, P ...p)
//           '5'    { 2 }

然后您正在打印第一个类型char

cout << t << ' ';
//     '5'

然后你再次使用其余参数调用该函数( recursion ):

output(p...); // p is only {2}

同样,您只打印出数字2

cout << t << ' ';
//      2

并且没有任何参数,它将调用基本情况:

void output()