相关疑难解决方法(0)

std :: ostringstream打印c-string的地址而不是其内容

我偶然发现了一个我最初无法解释的奇怪行为(见ideone):

#include <iostream>
#include <sstream>
#include <string>

int main() {
  std::cout << "Reference     : "
            << (void const*)"some data"
            << "\n";

  std::ostringstream s;
  s << "some data";
  std::cout << "Regular Syntax: " << s.str() << "\n";

  std::ostringstream s2;
  std::cout << "Semi inline   : "
            << static_cast<std::ostringstream&>(s2 << "some data").str()
            << "\n";

  std::cout << "Inline        : "
            << dynamic_cast<std::ostringstream&>(
                 std::ostringstream() << "some data"
               ).str()
            << "\n";
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

Reference     : 0x804a03d
Regular Syntax: some data
Semi inline   : some …
Run Code Online (Sandbox Code Playgroud)

c++ stream

19
推荐指数
2
解决办法
6599
查看次数

使用全局变量和仿函数实现日志记录

我想实现具有以下特征的C++日志记录:

  • 它必须对所有源代码都可用,而不需要每个函数都有一个额外的参数(我认为它需要一个全局参数)
  • 日志记录调用可以指定严重性级别(INFO,DEBUG,WARN等),并且可以在运行时设置日志记录工具以忽略低于特定严重性级别的调用
  • 可以在运行时将日志接收器设置为控制台或文件.

事情我并不需要的是:

  • 在运行时支持多个日志接收器(即,它都可以转到控制台或文件)
  • 支持多线程日志记录
  • 能够在记录器调用中传递cout样式表达式(例如"foo=" << foo).我只会通过一个std::string.

我找到了这个答案,这似乎是为了满足我的需求,但这有点过头了.我认为我的困惑集中在仿函数上.(我读过维基百科的文章,但显然没有沉入其中.)

下面是我的部分明白了:

  • 使用宏(例如LOG_DEBUG)方便地指定严重性级别并调用记录器.
  • 使用#ifdef NDEBUG以保持被编译的记录通话(但我需要能够在运行时设置日志记录).
  • 使用宏来调用记录器,以便它可以自动和无形地增加信息像的基本原理__FILE____LINE__在点记录器被调用.
  • LOG宏包含一个以static_cast<std::ostringstream&>.开头的表达式.我认为这纯粹与评估cout样式格式字符串有关,我不打算支持它.

这是我在努力的地方:

Logger& Debug() {
  static Logger logger(Level::Debug, Console);
  return logger;
}
Run Code Online (Sandbox Code Playgroud)

阅读operator(),它看起来像class Logger用于创建"仿函数".每个Logger仿函数都使用级别和LogSink进行实例化(?).(你是否"实例化"一个仿函数?)LogSink被描述为"后端消费预先格式化的消息",但我不知道它会是什么样子或它是如何"写入"的.在什么时候实例化静态Logger对象?是什么导致它被实例化?

这些宏定义......

#define LOG(Logger_, Message_)                   \
  Logger_(                                       \
    static_cast<std::ostringstream&>(            \
       std::ostringstream().flush() << Message_  \
    ).str(),                                     \
    __FUNCTION__,                                \
    __FILE__,                                    \
    __LINE__                                     \
  ); …
Run Code Online (Sandbox Code Playgroud)

c++ logging global-variables functor

14
推荐指数
1
解决办法
358
查看次数

标签 统计

c++ ×2

functor ×1

global-variables ×1

logging ×1

stream ×1