我想定義一個宏「BracketCout」之前或流參數後自動插入預置的字符串值的字符串COUT:如何創建一個預處理器定義圍繞與預定義的常量
#define LEFT_BOUNDARY "["
#define RIGHT_BOUNDARY "]"
#define BracketCout ??????
BracketCout << "123" << "abc"; // outputs "[123abc]"
怎麼可能那樣做?
我想定義一個宏「BracketCout」之前或流參數後自動插入預置的字符串值的字符串COUT:如何創建一個預處理器定義圍繞與預定義的常量
#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";
}
因爲我已經在使用一個日誌類,所以實現代碼小丑的建議是相當簡單的。下面是Logger類的簡化版本:
#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]"
啊當你更快!好的! :) – aggsol
我會重載字符串操作的'<<'運算符 – Najzero
不要使用宏,而是寫一個返回cout引用的函數。在對象的破壞只是添加結束] – aggsol