C++ 更改 istream

Rob*_*ijn 5 c++ istream

我目前正在学习 C++ 并且正在努力理解流。今天我学到了一个很酷的东西,你可以将一个字符串流拆分为多个浮点数/整数,例如:

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    stringstream ss("1 2.2");
    int val1; float val2;
    ss >> val1 >> val2;
    cout << "val1: " << val1 << endl
         << "val2: " << val2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在出现了一个问题,当我使用“1,2.2”代替“1 2.2”作为输入字符串时,这类似于我从 csv 文件中得到的内容。我希望能够编写一些内容,将这样的 csv 字符串转换为与上面示例中相同类型的流。我想它看起来像

ss >> mySpecialPipe >> val1 >> val2;
Run Code Online (Sandbox Code Playgroud)

现在我知道mySpecialPipe应该做几件事:

  1. 接受输入
  2. 拆分输入
  3. 在请求时写入输入

所以我试图建立这个:

#include <vector>
#include <string>
#include <iostream>
#include <sstream>

using namespace std;

class MySpecialPipe {
    private:
        char delimiter;
    public:
        vector<string> buffer;
        MySpecialPipe(char delimeter);
        friend istream& operator>> (istream &in, MySpecialPipe &p);
        friend istream& operator>> (MySpecialPipe &p, istream &in);
};

MySpecialPipe::MySpecialPipe(char delimeter): delimiter(delimeter) {}

istream& operator>> (istream &in,  MySpecialPipe &p)
{
    string s;
    while (getline(in, s, p.delimiter)) {
        p.buffer.push_back(s);
    }

    return in;
}

istream& operator>> (MySpecialPipe &p, istream &in) {
    for (string s: p.buffer) {
        // s >> in;
    }
    p.buffer.clear();
    return in;
}

int main() {
    MySpecialPipe p = MySpecialPipe(',');
    stringstream ss("1,2.2");
    stringstream ss2;
    ss >> p >> val1 >> val2;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我取消了该行的注释s >> in,因为编译器会抱怨,但基本上这就是我想要做的。这甚至可能吗?

如果你到了这里,谢谢你的时间,我期待着你的回答。