您不能重载输入运算符来工作,例如,使用int
. 我不完全确定你想要实现什么,但你可以处理不需要的分隔符的一种方法是将它们神奇地变成空格!假设您尝试使用循环读取数据
for (int a, b; std::cin >> a >> b; ) {
std::cout << "a=" << a << " b=" << b << "\n";
}
真正需要的是分隔符被视为空格并被跳过。为此,您可以使用自定义std::ctype<char>
方面:
#include <algorithm>
#include <iostream>
#include <locale>
struct ctype
: std::ctype<char>
{
typedef std::ctype<char> base;
static base::mask const* make_table(unsigned char space,
base::mask* table)
{
base::mask const* classic(base::classic_table());
std::copy(classic, classic + base::table_size, table);
table[space] |= base::space;
return table;
}
ctype(unsigned char space)
: base(make_table(space, table))
{
}
base::mask table[base::table_size];
};
int main()
{
std::locale global;
std::locale loc(global, new ctype(';'));
std::cin.imbue(loc);
for (int a, b; std::cin >> a >> b; ) {
std::cout << "a=" << a << " b=" << b << "\n";
}
}
注意:我尝试在 Mac 上使用 gcc 编译此代码,但失败了!原因实际上不在程序中,但问题是std::ctype<char>::classic()
返回一个空指针。我不知道那是什么。但是,使用 clang 和 libc++ 进行编译是可行的。