Получение адреса функции-манипулятора std :: flush, не равного ранее сохраненному адресу в статической переменной const

Я занимаюсь разработкой класса 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

Есть идеи?

С наилучшими пожеланиями,
Рейн А. Апеланд

2

Решение

Это похоже на определенную ошибку в компиляторе. Если бы были
DLL или что-то подобное, я мог бы понять, или, по крайней мере, сделать
извините, но в таком тривиальном примере, как ваш main… (г ++
правильно понял.)

Все, что я могу предложить, это вставить фильтрующий поток
в вашем выводе, который ловит звонки на sync,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]