2014-02-16 102 views
2

所以我有這個簡單的C++記錄器類。簡單的記錄器流操作器

class Log{ 
public: 
    Log(const int& msgLevel = 1){ 
     this->msgLevel = msgLevel; 
    } 

    template <class T> 
    Log& operator<<(const T& v){ 
     if (msgLevel<=level) { 
      std::cout << v; 
     } 
     return *this; 
    } 

    ~Log(){ 

    } 

    static int level; 
    int msgLevel; 
}; 

int Log::level = 1; 

我可以這樣使用它:

Log(1)<<"My debug info: "<<otherVariable; 

問題是,當我嘗試使用endl

Log(1)<<"My debug info: "<<otherVariable<<endl; 

我得到這個錯誤:

error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'Log' (or there is no acceptable conversion) 

要解決這個錯誤,我需要添加ano

// For manipulators like endl 
Log& operator<< (ostream& (*pf) (ostream&)) { 
    if (msgLevel<=level) { 
     cout << pf; 
    } 

    return *this; 
} 

但是添加這種方法只是爲了處理endl似乎有點矯枉過正,對我說:療法方法上我的課是這樣。有沒有更好的選擇?

另一種方法是使用「\ n」而不是endl;

+0

沒有嘗試的std :: ENDL – Jeef

+0

我使用空間std – dynamic

+0

下,我創建了一個類似的日誌類,但是我用了析構函數輸出換行符 –

回答

1

因爲endl是一個函數模板,所以operator<<的簡單版本不夠好,因爲可以通過使用endl的不同模板參數來匹配多種可能的方式。增加第二個過載可能是你能做的最好的。

你可以,但是,分解出共同的邏輯,就像這樣:

template <class T> 
Log& operator<<(const T& v){ return write(v); } 

Log& operator<<(ostream& (*v)(ostream&)){ return write(v); } 


template <typename T> 
Log& write(const T &v) 
{ 
    if (msgLevel<=level) { 
     std::cout << v; 
    } 
    return *this; 
}