c++ - 通过函数传递字符串流值,C++

标签 c++ function stringstream

我目前有一个日志系统,它接受一个 char* 和 var args,然后使用它们来执行 printf。这适用于 C 风格的字符串,但我想要一些更简洁的东西。目前,如果我使用 std::stringstream,我必须在日志系统之外创建 stringstream,然后将 char* 用于 stringstream 给出的字符串。它看起来像这样:

std::stringstream strStream;
strStream << "The value of x is: " << x;
logging::print( strStream.str().c_str() );

我想要的是将参数传递给函数,就好像我直接将它们与字符串流一起使用一样。从用户的角度来看,这看起来像这样:

logging::printStream("The value of x is: " << x);

或者可能是这样的:

logging::printStream("The value of x is: ", x);

有没有什么方法可以使用 stringstream 而无需在日志系统功能之外创建它来使用日志记录?

这尤其重要,因为我打算创建一个宏来防止任何函数参数在发布版本中编译。如果我必须在它之外创建 stringstream 并将其传入,则该宏将毫无用处。从技术上讲,我可以制作一个宏来执行我在这个问题中谈论的 stringstream 内容,但这非常困惑,因为我不会总是这样做将 stringstreams 与此日志记录一起使用,因此我将有一个用于标准日志记录的宏,以及一个用于使用 stringstreams 的不同宏,该宏在其中调用用于标准日志记录的宏。

最佳答案

以下按预期工作(已测试——用您的 logging::print 替换输出到 cerr):

#include<sstream>
#include<iostream>

class StringstreamLogger {
private:
    std::stringstream s;

public:
    StringstreamLogger () : s (std::ios_base::out) {
    }

    ~StringstreamLogger () {
    std::cerr << s.str () << std::endl; // logging::print (s.str ().c_str ());
    }

    std::stringstream& out () {
    return s;
    }
};

int main () {
    StringstreamLogger ().out () << "My log message";
    std::cerr << "Some later output to test for prompt logging (to ensure that logging is not delayed until the end of a block)" << std::endl;
}

关于c++ - 通过函数传递字符串流值,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802493/

相关文章:

c++ - Win32 位图彩色转灰度

javascript - 动态改变功能可以吗?

javascript - Noty(通知程序)不在函数内部工作

C++ 无法在类(和命名空间)中重载函数

c++ - 好吧,要么我疯了,要么 IBM 的编译器有错误

c++ - 在 MSVC 中解析命令行

c++ - 如何在 Visual Studio 2019 中启用 C++98 编译?

c++ - 我们如何在 C++ 的类构造函数中初始化 std::vector?

c++ - 停止直接执行主应用程序并从第二个应用程序执行?

c++ - 是否可以创建没有真实文件的ifstream