Имейте C ++ Class, действующий как пользовательский ostream, sstream
-
03-07-2019 - |
Вопрос
У меня есть класс 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
, ставить вокруг чего-то. Р>
Возможно ли это? Р>
Решение
попробуйте это
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;
Есть некоторые вещи, которые вам не удастся запихнуть в поток, но это должно работать для всех основ.
Другие советы
Вы можете найти ответы на как создать собственный ostream / streambuf ? полезно.
Я бы использовал немного другой подход и создал бы объект форматирования.
#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);
}