Обратная часть потока (между маркерами) с использованием эффекторов или манипуляторов - PullRequest
0 голосов
/ 18 ноября 2010

Привет!

Я хотел бы создать небольшую программу, которая переворачивает часть потока между маркерами, используя потоковые эффекторы и / или манипуляторы. Например:

Из этого: cout << "что-то" << revstream :: start << "asdf" << 3.14 << revstream :: end << "что-то"; </p>

К этому: something41.3fdsasomething

Мне бы хотелось, чтобы это работало не только со стандартным cout, и я хотел бы встраивать их несколько раз.

Я новичок в c ++, и мои основные проблемы: - Я не могу создать новый поток для хранения того, что находится внутри маркеров - Как реверсировать временный поток?

Я пробовал так много вещей и застрял здесь:

class revstream {

 public:

    static ostream& start(ostream &os) { 
        //do the reversing
    return ???;
    }    

    static ostream& end(ostream &os) {

    return reversedstream;
    }   
};

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

Вы можете сделать это, но это ужасно, как задница:

class revstream: public std::ostream
{
public:
    static std::ostream &start(std::ostream &os)
    {
        return *(new revstream(os));
    }

    static std::ostream &end(std::ostream &rev)
    {
        revstream *actual_rev= dynamic_cast<revstream *>(&rev);

        // logic for reversing output goes here

        std::ostream &result= actual_rev->os;
        delete actual_rev;

        return result;
    }

    revstream(std::ostream &in_os): std::ostream(&reversebuf), os(in_os)
    {
        return;
    }

    std::ostream &os;
    std::stringbuf reversebuf;
};

Ваш манипулятор ostream должен вернуть ссылку на ostream, поэтому вы должны выделить в revstream::start.

0 голосов
/ 18 ноября 2010

Это не то, как вы просили об этом, но я бы подошел к проблеме по-другому. Вместо того чтобы писать какое-то расширение для потоков, почему бы просто не написать функцию, которая переворачивает строку?

#include <string>
#include <iostream>
using namespace std;

string reverse(const string& str)
{
    return string(str.rbegin(), str.rend());
}

int main()
{
    cout << reverse("asdf") << "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...