我正在开发一个重载流插入运算符的记录器类。我很难抓住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
有任何想法吗?
最好的问候, Rein A. Apeland