如何为 cout 创建预处理器定义,该定义用预定义常量包围字符串

How to create a preprocessor define for cout that surrounds the string with predefined constants

本文关键字:定义 预定义 常量 字符串 包围 cout 创建 预处理 处理器      更新时间:2023-10-16

我想定义一个宏"BracketCout",它会自动在流参数之前或之后插入预设的字符串值:

#define LEFT_BOUNDARY "["
#define RIGHT_BOUNDARY "]"
#define BracketCout ??????
BracketCout << "123" << "abc"; // outputs "[123abc]"

怎么能做到这一点呢?

就像这样。

#include <iostream>
#include <sstream>
class BracketOut
{
public:
    BracketOut()
    {
        m_stream << '[';
    }
    ~BracketOut()
    {
        std::cout << m_stream.str() << ']' << std::endl;
    }
    std::ostringstream& get() { return m_stream; }
    std::ostringstream  m_stream;
private:
};

int main()
{
    BracketOut().get() << "Hello World";
}

由于我已经在使用日志类,因此实现 Code Clown 的建议相当简单。下面是记录器类的简化版本:

#define LOG Log().out()
class Log
{
public:
  Log() {}
  virtual ~Log();
  std::ostringstream& out();
public:
  std::ostringstream os;
};

std::ostringstream& Log::out()
{
  os << "["; // beginning
  return os;
}

Log::~Log() // destructor
{
  os << "]";
  std::cout << os.str() << std::endl;
}

要使用它,我会打电话

LOG << "abc" << 123; // prints "[abc123]"