2

istream入力から 2 文字を読み取り、入力から 2 文字をスキップして、入力がなくなるまでそれを行うカスタム マニピュレータを作成したいと考えています。

たとえば、次のようなコードがあるとします。

std::string str;
std::cin >> skipchar >> str;

skipcharユーザーが を入力した場合、マニピュレータはどこにあり1122334455strが含まれている必要があります113355

これは私がこれまでに得たものです。このコードを適切に機能させるには、while ループ条件に何を入れるべきかわかりません。

istream& skipchar(istream& stream)
{
    char c;

    while(1)
    {
        for (int i = 0; i < 2; ++i)
            stream >> c;

        for (int i = 0; i < 2; ++i)
            stream.ignore(1, '\0');
    }

    return stream;
}

どんな助けでも大歓迎です。

4

2 に答える 2

2

とてもいい質問ですね。それが可能かどうかはわかりません。>> operatorしかし、 という新しいクラスで をオーバーロードすることにより、必要な同じ短い構文を提供する別のものを実装しましたSkip2。これがコードです(私はこれを書くのが本当に楽しかったです! :-) )

#include <iostream>
#include <string>
#include <istream>
#include <sstream>

using namespace std;

class Skip2 {
public:
    string s;
};

istream &operator>>(istream &s, Skip2 &sk) 
{
    string str;
    s >> str;

    // build new string
    ostringstream build;
    int count = 0;
    for (char ch : str) {
        // a count "trick" to make skip every other 2 chars concise
        if (count < 2) build << ch;
        count = (count + 1) % 4;
    }

    // assign the built string to the var of the >> operator
    sk.s = build.str();

    // and of course, return this istream
    return s;
}



int main()
{
    istringstream s("1122334455");
    Skip2 skip;

    s >> skip;
    cout << skip.s << endl;

    return 0;
}
于 2016-08-16T19:45:34.320 に答える