I am learning C++, and in the part of user-defined output stream manipulatior, I am stuck. This is the example code:
#include
using
std::ostream has an overload of operator<< that takes a pointer to a function (or something similar that can be invoked, anyway) that accepts the pointer, and invokes the function, passing itself as a parameter to the function:
std::ostream &operator<<(std::ostream &os, ostream &(*f)(ostream &os)) {
return f(*this);
}
The version that's built in to ostream comes from std::ios_base (and that's the type it uses for the parameter and return), but if you're trying to write your own, you typically want to use std::ostream instead.
cout's left shift operator calls endLine with cout as an argument. Functions (technically function pointers) don't need to be called when you write their names; you can pass them around as values and have some other code call them later.
std::basic_ostream has several overloads of operator<<, one of which has the following signature:
basic_ostream& operator<<( basic_ostream& st, std::basic_ostream& (*func)(std::basic_ostream&) );
That is, this function takes a pointer to a function that both takes and returns std::ios_base. The method is called by this function and is incorporated into the input/output operation. Thereby making this possible:
std::cout << endLine;
So what will happen is that endLine is converted into a function pointer and a new line character will be written to the stream and afterwards a flush operation.