Реализация функции, которая "подключается" в поток - PullRequest
1 голос
/ 27 февраля 2011

Я реализовал функцию, которая печатает макет памяти структуры / класса. Я бы хотел, чтобы эта функция «подключалась» к потоку следующим образом:

BaseStruct1 struct1;
cout << "The struct1 object is:" << endl;
cout << OutputObjectLayout(&struct1, sizeof(struct1)) << endl;

Как это можно сделать? Спасибо за любой вклад!

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Перегрузка оператора <<.

См .: http://www.java2s.com/Code/Cpp/Overload/Overloadstreamoperator.htm

1 голос
/ 27 февраля 2011

Я наконец-то нашел ответ здесь: http://my.safaribooksonline.com/book/programming/cplusplus/0596007612/streams-and-files/cplusplusckbk-chp-10-sect-3.

Вот пример того, как это можно сделать:

Для начала нам нужно определить временный класс. Временная структура должна выглядеть примерно так:

class WidthSetter {
public:
   WidthSetter (int n) : width_(n) {}
   void operator( )(ostream& os) const {os.width(width_);}
private:
   int width_;
};

Смысл этого поведения в том, что WidthSetter будет создан одной функцией и использован другой. Функция манипулятора это то, что его построит, и она должна выглядеть так:

WidthSetter setWidth(int n) {
   return(WidthSetter(n));   // Return the initialized object
}

Все, что это делает, возвращает объект WidthSetter, который был инициализирован целочисленным значением. Это тот манипулятор, который мы будем использовать в соответствии с оператором <

myostream << setWidth(20) << "banana";

Но одного этого недостаточно, потому что если setWidth просто возвращает объект WidthSetter, оператор << не будет знать, что с ним делать. Мы должны перегрузить оператор <<, чтобы он знал, как обрабатывать WidthSetter: </p>

ostream& operator<<(ostream& os, const WidthSetter& ws) {
   ws(os);     // Pass the stream to the ws object
   return(os); // to do the real work
}
...