将stringstream宏转换为函数

时间:2015-07-06 19:12:01

标签: c++

我有一个看起来像这样的宏:

#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

3 个答案:

答案 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__);