我很好奇是否有可能为函数重载<<
流操作符?
我在Windows上使用OutputDebugString
来写入日志,它只接受字符串。
我想知道我是否可以在c ++中编写一个函数,我可以在其中包装OutputDebugString
并执行以下操作
MyLogFuntion() << string << int << char;
答案 0 :(得分:2)
您可以从具有operator <<
的函数返回一个对象,然后在对象的析构函数中进行日志记录。然后当你调用MyLogFunction()
时,它将创建一个临时对象,它将存储插入其中的所有数据,然后在对象超出语句末尾的范围时输出它。
这里是example(没有记录器功能,实际上是多余的)
#include <iostream>
#include <sstream>
class Logger {
std::stringstream ss;
public:
~Logger() {
// You want: OutputDebugString(ss.str());
std::cout<< ss.str();
}
// General for all types supported by stringstream
template<typename T>
Logger& operator<<(const T& arg) {
ss << arg;
return *this;
}
// You can override for specific types
Logger& operator<<(bool b) {
ss << (b? "Yep" : "Nope");
return *this;
}
};
int main() {
Logger() << "Is the answer " << 42 << "? " << true;
}
输出:
答案是42吗?是的
答案 1 :(得分:0)
您不能以您希望的方式提供重载。
如果您要使用的方法(在您的情况下为OutputDebugString
)强制您提供std::string
(或类似)参数,你必须以某种方式提供该参数。一种方法是使用std::stringstream
流,然后将结果传递给OutputDebugString
:
std::stringstream ss;
ss << whatever << " you " << want << to << stream;
OutputDebugString(ss.str());
如果你真的想要更紧凑的东西,你也可以将它转储到宏中:
#define OUTPUT_DEBUG_STRING(streamdata) \
do { \
std::stringstream ss; \
ss << streamdata; \
} while (0)
然后写
OUTPUT_DEBUG_STRING(whatever << " you " << want << to << stream);
另一种方法是在OutputDebugString
周围编写一个更复杂的包装类,它提供了流操作符。但这可能不值得付出努力。