Что такое `std :: ostream & (* f) (std :: ostream &)` при перегрузке `<<` и зачем мне это нужно? - PullRequest
0 голосов
/ 08 января 2019

Я работаю в оболочке для boost.log и нашел этот вопрос, который, кажется, мне нужен, но вместо std::cout было бы что-то, связанное с boost поток, который я пока не знаю. Для этого я застрял в удивлении, зачем это нужно и что он на самом деле делает. Например:

MyCout& operator<< (MyCout &s, std::ostream& (*f)(std::ios &)) {
    f(std::cout);
    return s;
}

В этом случае я понимаю (или, возможно, нет?), Что я перегружаю оператор << для MyCout, используя std::ostream& (*f)(std::ios &), но почему это так? Что на самом деле делает f(std::cout) и почему мне нужно перегрузить оператор этой функцией? Кажется, что s вообще не использовался, просто проходил через оператора и возвращал то же, что и раньше.

Спасибо!

1 Ответ

0 голосов
/ 08 января 2019

std::ostream& (*f)(std::ios &) - это указатель на функцию с именем f, который указывает на функцию, которая принимает std::ios & в качестве единственного параметра и возвращает std::ostream&. Это необходимо для некоторых потоковых манипуляторов , таких как std::endl, которые являются функцией, а не объектом, подобным std::cout is.

С этой перегрузкой вы можете направить функцию в ваш поток и заставить эту функцию выполнять какие-то манипуляции с потоком


Не надо, чтобы эта сигнатура функции была не тем, что вы действительно хотите. Тип входного параметра и тип возвращаемого значения должны быть одинаковыми. Стандартные перегрузки для operator <<, которые принимают функции манипулятора:

basic_ostream& operator<<(
    std::ios_base& (*func)(std::ios_base&) );

basic_ostream& operator<<(
    std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );

basic_ostream& operator<<(
    std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );

basic_istream& operator>>( 
    std::ios_base& (*func)(std::ios_base&) );

basic_istream& operator>>( 
    std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );

basic_istream& operator>>( 
    basic_istream& (*func)(basic_istream&) );
...