在尝试理解可变参数模板的概念时。我遇到了这个例子。这对我来说似乎是一个简约的例子。
.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)当作者声明可变类是递归的,因此它们需要基类时,这是什么意思
答案 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()