2013-10-10 40 views
1

我想定義一個宏「BracketCout」之前或流參數後自動插入預置的字符串值的字符串COUT:如何創建一個預處理器定義圍繞與預定義的常量

#define LEFT_BOUNDARY "[" 
#define RIGHT_BOUNDARY "]" 

#define BracketCout ?????? 

BracketCout << "123" << "abc"; // outputs "[123abc]" 

怎麼可能那樣做?

+0

我會重載字符串操作的'<<'運算符 – Najzero

+0

不要使用宏,而是寫一個返回cout引用的函數。在對象的破壞只是添加結束] – aggsol

回答

1

就這樣。

#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"; 
} 
1

因爲我已經在使用一個日誌類,所以實現代碼小丑的建議是相當簡單的。下面是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]" 
+0

啊當你更快!好的! :) – aggsol