【问题标题】:Locally Overriding the string Extraction Operator本地覆盖字符串提取运算符
【发布时间】:2015-04-17 11:29:35
【问题描述】:

我有一组实用函数,它们从流中逐行读取,而不是逐字读取。它们与strings 一起工作,所以我想仅在这些函数的范围内本地更改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&amp; operator&gt;&gt;(istream&amp; lhs, string&amp; rhs) 来完成这个吗?

【问题讨论】:

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


    【解决方案1】:

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

    您可以做的一件事是提供从linestd::string 的转换,这样您的容器就可以是std::vector&lt;std::string&gt; 而不是std::vector&lt;line&gt;

    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 类型就不必存在于提取过程之外并渗入您的代码库的其余部分。

    【讨论】:

    • 感谢您的回答,尽管这让我很伤心。这实际上就是我正在做的事情,我只是不想把问题弄得太混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多