我有一个看起来像这样的宏:
#define LOG_MESSAGE(message, level) { std::stringstream _s; _s << message; Singleton->LogMessage(_s.str().c_str(), level, __FILE__, __LINE__); }
可以像这样调用:
LOG_MESSAGE("Name: " << name", ENUM::WARNING);
我想将它转换为函数,可能类似于
void LogMessage(const char* const message, const char* const file, int line)
{
}
问题是您必须像这样调用此函数:
std::stringstream s;
s << "Name: " << name;
LogMessage(s.str().c_str(), __FILE__, __LINE__);
我想要的是:
LogMessage("Name: " << name, __FILE__, __LINE__);
有没有什么方法可以让它成为像宏一样的单线眼镜?我将如何使用流&lt;&lt;有功能的操作员?有没有一种聪明的方法可以使用模板或用类覆盖运算符?
我无法访问c ++ 11
答案 0 :(得分:2)
是的,你可以。这是一个例子
#include <sstream>
#include <Windows.h>
void LogMessage(const std::basic_ostream<char>& ss, const char* const file, int line)
{
std::stringstream ss1;
ss1 << file << "(" << line << "): " << static_cast<const std::stringstream&>(ss).str();
OutputDebugStringA(ss1.str().c_str());
}
int main()
{
LogMessage(std::stringstream() << "Hello," << " World! " << 5, __FILE__, __LINE__);
return 0;
}
或者,在每个记录行中保存一些输入:
#include <sstream>
#include <Windows.h>
class Logger
{
std::stringstream _ss;
std::string _file;
int _line;
public:
Logger(const char* const file, int line)
{
_file = file;
_line = line;
}
~Logger()
{
std::stringstream ss1;
ss1 << _file << "(" << _line << "): " << _ss.str();
OutputDebugStringA(ss1.str().c_str());
}
template<typename T>
Logger& operator<<(const T& value)
{
_ss << value;
return *this;
}
};
#define LOG Logger(__FILE__, __LINE__)
int main()
{
// approach 1: with a macro, saving from typing of __FILE__ and __LINE__ each time
LOG << "Hello," << " World! " << 6;
// approach 2: without a macro, but with typing of __FILE__ and __LINE__ each time
Logger(__FILE__, __LINE__) << "Hello," << " World! " << 7;
return 0;
}
答案 1 :(得分:1)
基本上没有。
宏是传统的解决方法,所以我不确定你为什么要试图抛弃它!
答案 2 :(得分:0)
您可以这样做的一种方法是将"Name: "
作为字符串添加message
,然后使用组合字符串的c_str()
方法。
LogMessage((string("Name: ") + message).c_str(), __FILE__, __LINE__);