c++ - 本地覆盖字符串提取运算符

标签 c++ string operator-overloading getline extraction-operator

我有一组实用函数,它们从流中逐行读取,而不是逐字读取。它们与 string 一起使用,因此我只想在这些函数的范围内本地更改 string 提取运算符。这可能吗?


我现在正在做的是创建一个 struct,它是一个 string 并仅为该结构编写一个提取运算符。

struct line{
    string str;
};

istream& operator>>(istream& lhs, line& rhs){
    return getline(lhs, rhs.str);
}

然后像这样提取istream:

vector<line> foo{ istream_iterator<line>(istringstream("Lorem Ipsum\nLorem Ipsum")), istream_iterator<line>() };

这很好用,但我不喜欢 struct line 包装器。我想问的是,我可以在本地重载 istream& operator>>(istream& lhs, string& rhs) 来完成这个吗?

最佳答案

您所要求的是不可能的。已经存在一个 istream& >>(istream&, string& ) , 所以你不能简单地覆盖它。提供另一种类型已经是这样做的方法了。

您可以做的一件事是提供从 line 的转换至 std::string这样你的容器就可以是 std::vector<std::string>而不是 std::vector<line>

struct line{
    string str;
    operator string() const { return str; }
};

istringstream iss("Lorem Ipsum\nLorem Ipsum");
vector<string> foo{istream_iterator<line>(iss),
                   istream_iterator<line>() };

那样line type 不必存在于提取过程之外,也不必渗入代码库的其余部分。

关于c++ - 本地覆盖字符串提取运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29697963/

相关文章:

c++ - 将 C 字符串和 fortran 字符串混合在一个文件中

c++ - 无法对匿名对象使用运算符<<

c++ - 成员没有默认构造函数

c++ - 使用 boost spirit (qi) 解析帝国值

java - Android字符串资源无法访问: android. content.res.Resources$NotFoundException:字符串资源ID

c++ - 如何重载运算符 -= C++

fortran - 在内部类型上重载 Fortran 内部运算符?

c++ - 避免在内存中创建多个代码拷贝

c++ - 如何配置共享内存?

c++ - 如何制作同时适用于窄和宽的预处理器字符串