所以我从Java未来在这里你可以使用扫描仪从输入中读取C++中的声明?
int n = s.nextInt();
现在,我与C++涉足时做这样的事情,我觉得很讨厌的事:
int n;
cin >> n;
有没有简单的方法来读取变量声明中的输入?
所以我从Java未来在这里你可以使用扫描仪从输入中读取C++中的声明?
int n = s.nextInt();
现在,我与C++涉足时做这样的事情,我觉得很讨厌的事:
int n;
cin >> n;
有没有简单的方法来读取变量声明中的输入?
你可以只让一个辅助函数为你做这一点:
// Using an anonymous namespace, since this is intended to
// be just an internal utility for your file... it's not
// a super awesome, shareable API (especially since it hard
// codes the use of std::cin and has no error checking).
namespace {
// Helper function that reads an integer from std::cin.
// As pointed out in Robin's solution, you can use a template
// to handle other types of input, as well.
int ReadInt() {
int result;
std::cin >> result;
return result;
}
}
然后,你可以这样做:
int n = ReadInt();
如果你想真正全力以赴,不过,你可以创建一个更复杂的解决方案:
namespace input_utils {
class IOException {};
class Scanner {
public:
Scanner() : input_(std::cin) {}
Scanner(std::istream& input) : input_(input) {}
template<typename T> T Read() {
CheckStreamOkay();
T result;
input_ >> result;
CheckStreamOkay();
return result;
}
private:
void CheckStreamOkay() {
if (!input_) {
throw IOException();
}
}
std::istream& input_;
};
}
然后,你可以这样做:
input_utils::Scanner scanner(std::cin);
int a = scanner.Read<int>();
int b = scanner.Read<int>();
double c = scanner.Read<double>();
...
虽然在这一点上,你可能想要寻找一个已经做到这一点的现有库。
要模拟Java行为,您应该在失败时抛出异常。或者你应该至少有*某种方式来表明这里的失败。 –
@BenjaminLindley如果我们真的要模拟Java行为,那么我们应该有一个包装器“扫描器”类,它应该采用任意“std :: istream”作为输入,而不是严格的std :: cin。我同意你的意思,但是OP只是简单地询问语法的简单性(而且给出的例子也没有做任何检查)。这立即解决了OP的难点,但你说得对,这需要很多改进才能成为一个好的API。 –
很好的例子把这些答案放在一起。 +1 –
有没有内置的快捷方式,但你当然可以弥补这方面自己的函数:
int read_int() {
int res;
cin >> res;
return res;
}
...
int a = read_int();
制作使用模板(由dasblinkenlight和迈克尔·亚伦Safyan更通用的建议的功能现已并入迈克尔的回答的最后一个例子):
#include <iostream>
template<typename T> T read();
template<typename T>
T read<T>() {
T ret;
std::cin >> ret;
return ret;
}
int main() {
int i = read<int>();
double d = read<double>();
std::cout << i << std::endl << d;
return 0;
}
如何短,你需要做 –
计数的空间在你的速记? –