Имейте C ++ Class, действующий как пользовательский ostream, sstream - PullRequest
7 голосов
/ 05 мая 2009

У меня есть класс C ++ MyObject, и я хочу иметь возможность передавать эти данные так же, как и в osstream (но в отличие от прямого потока, входные данные должны быть отформатированы специальным образом). Кажется, я не могу понять, как перегрузить оператор для MyObject, чтобы он использовал данные, полученные для него.

class MyObject {
public:
    ostringstream s;
    FEEDME
};


int main() {
     MyObject obj;
     obj.FEEDME << "Hello" << 12345;

     // I want obj.s == ":Hello::12345:"

}

Я хочу, чтобы каждый загруженный предмет был окружен::

Таким образом, в данном примере s = ": Hello :: 12345" должен быть конечным результатом. В чем мой вопрос, как я могу сказать объекту, когда когда-либо <<something, ставим вокруг чего-то.

Возможно ли это?

Ответы [ 3 ]

10 голосов
/ 05 мая 2009

попробуйте это:

class MyObject {
public:
    template <class T>
    MyObject &operator<<(const T &x) {
        s << ':' << x << ':';
        return *this;
    }

    std::string to_string() const { return s.str(); }

private:
    std::ostringstream s;
};

MyObject obj;
obj << "Hello" << 12345;
std::cout << obj.to_string() << std::endl;

Есть определенные вещи, которые вы не сможете вставить в поток, но это должно работать для всех основ.

1 голос
/ 05 мая 2009

Я бы выбрал немного другой подход и создал бы формирующий объект.
Затем объект форматера будет обрабатывать вставку символа формата при его применении к потоку.

#include <iostream>

template<typename T>
class Format
{
    public:
        Format(T const& d):m_data(d)    {}
    private:
        template<typename Y>
        friend std::ostream& operator<<(std::ostream& str,Format<Y> const& data);
        T const&    m_data;
};
template<typename T>
Format<T> make_Format(T const& data)    {return Format<T>(data);}

template<typename T>
std::ostream& operator<<(std::ostream& str,Format<T> const& data)
{
    str << ":" << data.m_data << ":";
}




int main()
{
    std::cout << make_Format("Hello") << make_Format(123);
}
1 голос
/ 05 мая 2009

Вы можете найти ответы на вопрос Как мне создать собственный ostream / streambuf? полезно.

...