Я занимаюсь разработкой класса logger, который перегружает оператор вставки потока.
У меня проблемы с ловлей std::flush
Манипулятор.
Сначала краткое резюме того, что я делаю:
Учитывая объект LogClass
Я хочу сделать следующее:
LogClass logger;
logger << "Some text" << std::flush;
… и поймать std::flush
Манипулятор.
Все входные данные отправляются непосредственно во внутренний поток строк для последующей регистрации с помощью следующего встроенного оператора (который отлично работает):
class LogClass
{
// ...
std::ostringstream m_internalStream;
template <typename T>
LogClass & operator<<(const T & rhs)
{
m_internalStream << rhs;
return *this;
}
// ...
};
Я пытаюсь поймать std::flush
перегрузить манипулятор следующим образом (что тоже отлично работает):
LogClass & LogClass::operator<<(std::ostream & (*manip)(std::ostream &))
{
std::ostream & (* const flushFunc)(std::ostream &) = std::flush;
// Is the supplied manipulator the same as std::flush?
if ((manip == flushFunc)) {
flush(); // <-- member function of LogClass
} else {
manip(m_stream);
}
return *this;
}
Проблема показывает, если я пытаюсь сделать локальную переменную flushFunc
статический, как следует:
static std::ostream & (* const flushFunc)(std::ostream &) = std::flush;
В этом случае значение входящего manip
указатель не равно flushFunc
,
Это почему? Имеет ли это какое-либо отношение к шаблонным экземплярам std::flush
функция для char
?
Я использую MS Visual Studio 2010 Pro.
Проблема также показана в этом небольшом фрагменте рабочего кода:
#include <iostream>
#include <iomanip>
int main(int, char **)
{
static std::ostream & (* const staticFlushPtr)(std::ostream &) = std::flush;
std::ostream & (* const stackFlushPtr)(std::ostream &) = std::flush;
std::cout << std::hex <<
"staticFlushPtr: " << (void *) staticFlushPtr << "\n""stackFlushPtr: " << (void *) stackFlushPtr << "\n";
return 0;
}
… который дает этот вывод на моей машине:
staticFlushPtr: 013F1078
stackFlushPtr: 0FF10B30
Есть идеи?
С наилучшими пожеланиями,
Рейн А. Апеланд
Это похоже на определенную ошибку в компиляторе. Если бы были
DLL или что-то подобное, я мог бы понять, или, по крайней мере, сделать
извините, но в таком тривиальном примере, как ваш main
… (г ++
правильно понял.)
Все, что я могу предложить, это вставить фильтрующий поток
в вашем выводе, который ловит звонки на sync
,
Других решений пока нет …