【发布时间】:2015-10-25 20:59:45
【问题描述】:
我写了一个简单的可变参数模板函数,我试图理解为什么它不起作用。 (它的输出对应完美。)
#include <iostream>
void read() {}
template<class curr_t, class... rest_t>
void read(curr_t &var, rest_t... rest)
{
std::cin >> var;
read(rest...);
}
int main()
{
int a = 0, b = 0, c = 0;
read(a, b, c); //input: 1 2 3
std::cout << a << b << c; //output: 1 0 0
std::cin.ignore();
std::cin.get();
}
从 cmets 可以看出,我为 a b c 输入 1 2 3,得到的输出是 1 0 0。很明显,只有a 保存了它的价值。有人可以解释为什么会发生这种情况,我能做些什么来解决它?谢谢!
编辑::
是的,显然我对参数包的概念有误!
我还尝试执行以下操作:rest_t... &rest 这给了我一个编译器错误。
相反,如果我写 rest_t&... rest 它会按预期工作。我想这只是我这边的一个语法错误!感谢发布此答案并在一分钟后删除他的答案的人! D:
【问题讨论】:
-
也许它与
rest被传值有关? -
你不认为函数
read会无限递归吗? -
但据我了解,作为参数包“解包”,包的第一个元素(在这种情况下)变为 curr_t &var。
-
@vishal 为什么会无限递归?
-
@vishal 这就是
read()存在的原因,它可以捕获使用零参数调用read,这最终会在rest...为空时发生。