在扩展中使用字符串流创建记录宏

时间:2013-04-28 00:50:10

标签: c++ boost c-preprocessor

我正在努力实现这个目标:

#include <iostream>
#include <sstream>

void log(
        const char* argFile,
                int argLineNb,
                const char* argFunction,
                std::stringstream& argString) {
    std::cout << argFile << ":" << argLineNb << " " << argFunction
        << " " << argString.str()<< std::endl;
}


/**
 * \brief       Macro declarations
 */

#define LOG_TEST(f) \
                log(__FILE__, __LINE__, \
                        __FUNCTION__, (std::ostringstream << f))

int main(int argc, char** argv) {

    LOG_TEST("HELLO");
    LOG_TEST("HELLO" << " !");

    return 0;
}

问题是我真的不知道怎么做,因为我收到以下错误:

  

无效初始化类型'std :: stringstream&amp;的引用{std :: basic_stringstream&amp;}'来自类型'std :: basic_ostream :: __ ostream_type {aka std :: basic_ostream

的表达式

我不知道是否有一种更简单的方法可以通过提升...

以下是来源:http://coliru.stacked-crooked.com/view?id=222cbb23ea5162b16378b13a24fceb9e-4f0e144d2529f0880899ab58231ebbe3

1 个答案:

答案 0 :(得分:2)

这里的主要问题是:(std::stringstream() << f)

如果您阅读std::stringstream operator<<(...)的引用,您会发现它是继承自std::ostream

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

问题是operator<<(...)返回std::ostream,因此,当您通过(std::stringstream() << f)时,实际上是将std::ostream传递给需要std::stringstream的函数(因此,来自ostream的字符串流的无效初始化)

要实现您想要的,确切地说,您必须修改宏的工作方式。尝试这样的事情:

#define LOG_TEST(f) \
    do { std::stringstream s; \
         s << f; \
         log(__FILE__, __LINE__, __FUNCTION__, s); \
    } while (0)