我正在开发一个记录器类,它重载流插入操作符。我很难抓住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 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有什么想法吗?
向你问好,雷恩·A·阿普兰
发布于 2014-01-16 14:58:32
这看起来像是编译器中的一个明确的错误。如果涉及DLL之类的,我可以理解它,或者至少找借口,但是在一个像你的main这样的小例子中.(g++说得对。)
我所能建议的就是在输出中插入一个过滤流,它捕获对sync的调用。
https://stackoverflow.com/questions/21164360
复制相似问题