嗨,我正在研究参数包。我刚刚编写了一个示例代码,但我遇到了一些错误。
代码:
#include <string>
using namespace std;
template<typename T> void inputer(){}
template<typename T,typename... Rest> void inputer(const T& x, Rest... rest)
{
cin>>x;
inputer<T>(rest...);
}
int main()
{
int a,b;
inputer<int>(a,b);
return 0;
}
我没有看到任何错误(我对参数包没有经验)。 如何获得像我正在尝试的效果。
此致
PS:当我改变
template <typename T> void inputer(){}
到
template <typename T> void inputer();
代码无法编译。为什么?
答案 0 :(得分:1)
通过引用传递所有参数。准确地引用非const:
template <typename T, typename... Rest>
void inputer(T& x, Rest&...) { .. }
cin >> x
无法修改const int&
,如果您按值传递Rest
,则输入不会反映在传递的b
中,而是反映在参数内包。
为什么
template <typename T> void inputer();
不编译?
因为必须定义,为什么不呢?如果里面有代码,则会在打印完所有参数后执行。
此外,正如评论中所提到的,没有参数的inputer
不需要是模板,只需要重载:
void inputer();
并像这样递言:
inputer(rest...);
T
是错误的,如果包的第一个参数与第一个参数不同,它只会破坏整个事物。
答案 1 :(得分:0)
您有多个问题:
void inputer(const T& x, Rest... rest)
:x
是const,因此无法用于cin >> x
。此外,rest
应作为参考传递。
将其更改为void inputer(T& x, Rest... rest)
。
inputer<T>(rest...);
必须为inputer<Rest&...>(rest...);
您应该检查cin >> x
是成功还是失败。
您的inputer
始终需要至少一个模板参数。由于它的递归结构,它可能没有任何调用。
您应该为此案例提供解决方案。
工作版
#include <string>
#include <iostream>
using namespace std;
template<typename...Args> bool inputer();
template<typename T, typename... Rest>
bool inputer(T& x, Rest&... rest)
{
if (!(cin >> x)) return false;
return inputer<Rest...>(rest...);
}
template<typename T>
bool inputer(T& x)
{
if (!(cin >> x)) return false;
return true;
}
int main()
{
int a = 0, b = 0;
inputer<int, int>(a, b);
return 0;
}