本地覆盖字符串Extraction Operator

时间:2015-04-17 11:29:36

标签: 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)来实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

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

您可以做的一件事是提供从linestd::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类型不必存在于提取过程之外,并且会渗透到代码库的其余部分。