一个有意思的c++输入语法糖


c++

重载>>运算符,用来匹配并跳过流中的分隔符:

1
2
3
4
5
6
7
8
9
std::istream& operator>>(std::istream& ins, const char* s) {
while (*s) {
char c = '\0';
if (!(ins >> c)) return ins;
if (c != *s) { ins.setstate(std::ios::failbit); return ins; }
s += 1;
}
return ins;
}

运行示例:

1
2
3
4
5
6
7
int main()
{
int v[4] = {0, 0, 0, 0};
std::istringstream("1,2;3,4") >> v[0] >> "," >> v[1] >> ";" >> v[2] >> "," >> v[3];
std::cout << v[0] << "," << v[1] << ";" << v[2] << "," << v[3]; // 1,2;3,4
return 0;
}

如此,数据输入和分隔符检测仅用一条>>语句即可完成,视觉上无需为额外的分隔符检查代码打断,而且输入输出的代码格式具有优雅的对应关系。

注意:虽然示例中的分隔符都只有一个字符,但并不能通过重载std::istream& operator>>(std::istream&, const char)来实现相似的功能,因为编译器无法将其与std::istream& operator>>(std::istream&, char&)区分。