2015-06-25 60 views
0

我試圖編寫一個方法,將參數使用>>運算符作爲參數類似於std::cin但我不知道如何。是否有可能創建這種類型的方法,如參數,將其正確轉換(例如,將所有整數轉換爲字符串等),然後保存到std :: string變量中?我真的會贊同所有的幫助,也許一些基本的例子?運算符<<在用戶定義的方法

這裏是我想如何運行函數的一個例子:

int i = 0; 
myMethod << "some text" << i << "moar text"; 

內部的方法,我想利用這些參數,並存儲在一個字符串。

編輯:我會盡力解釋這個應用程序是關於什麼:我正在嘗試製作一個Clogger sigleton類,它將用於將日誌保存到文件中。通過這種結構,我可以在代碼中的任何地方撥打*CLogger::instance() << "log stuff";,那就行了。感謝來自這個話題的答案,我已經談到這一點。問題是我使用的每個operator<<,那麼該對象將被調用。所以,如果我做* CLogger ::實例()< < 「登錄的東西」 < < 「更多的東西」 < < 「更」;`這個方法將被稱爲3次(?):

template<typename T> 
    CLogger& operator<<(const T& t) 
    { 
     ... 

     return *this; 
    } 

這對我並不好,因爲我打算在每個日誌行之前和之後添加一些文本。例如,我總是希望在添加時間之前和std::endl之後。下面我給的不是獲取的例子:

[00:00] log stuff more stuff even more 

我會得到:

[00:00] log stuff 
[00:00] more stuff 
[00:00] even more 

所以我做出了嘗試通過改變這樣的methiod刪除此行爲:

template<typename T> 
    CLogger& operator<<(const T& t) 
    { 
     ostringstream stream; 
     stream << t; 
     m_catString += stream.str(); 

     if (stream.str() == "\n") 
     { 
      push_back(m_catString); 
      m_catString.clear(); 
     } 

     return *this; 
    } 

這樣,如果我在末尾添加"\n",程序就知道何時推送新的日誌行。它幾乎可以,因爲我敢打賭我會忘記添加這個。有沒有更聰明的方法?

+3

有成千上萬的教程和關於此的問題,每本介紹性的C++書都涵蓋了它。如果您遇到困難,請嘗試閱讀並返回。 – user657267

+0

也修復您的標題。您在那裏有錯誤的操作員。 – juanchopanza

+0

@juanchopanza謝謝你的提示,我修好了。問題是這個主題不是那麼基本,我發現很難找到任何關於它的直接信息。另外,C++書籍並沒有真正地說過多。 – Bremen

回答

1

您無法將參數傳遞給使用<<的方法,您需要一個對象。

事情是這樣的:

struct A 
{ 
    template<typename T> 
    A& operator<<(const T& t) 
    { 
     std::ostringstream stream; 
     stream << t; 
     data += stream.str(); 
     return *this; 
    } 
    std::string data; 
}; 

// ... 

A a; 
a << "Hello " << 34 << " World"; 
std::cout << a.data; 

關於你提到的更新:

最明顯的一點就是實現運營商CLogger來代替,而擺脫Pusher類的;那會讓你寫*CLogger::instance() << "sample text" << 10;

如果因爲某些原因你不能這麼做(你發出的信息是零碎的,所以很難說),你可以聲明Pusher一個朋友,並使用與其他地方相同的方法:

struct Pusher 
{ 
    template<typename T> 
    Pusher& operator<<(const T& t) 
    { 
     std::ostringstream stream; 
     stream << t; 
     CLogger::instance()->push_back(stream.str()); 
     return *this; 
    } 

}; 
+0

我現在非常接近,我已經更新了我的代碼關於你的答案,但我會aprieciate後續答案。 – Bremen

+0

請告訴我你需要更多的信息,我會提供。我真的很想打電話給你指定的運營商。這就是我需要的,但是就像你說的我不能這樣運行:'錯誤:類型'CLogger *'和'const char [12]'的無效操作數'到二元運算符<<' – Bremen

+0

@ŁukaszPrzeniosło你忘了' *'。 – molbdnilo

1

我知道的唯一方法是創建一個類class Method然後超載operator<<operators overloading

template<class T> 
Method &operator<<(const T &x) 
{ 
    // Do whatever you like 
    return *this; 
} 

然後你可以使用它像:

Method myMethod; 
myMethod << ... ; 

你可以看看this question有關創建cout-like class std :: cin和std :: cout不是順便的功能

編輯

class CLogger 
{ 
    ... 

    template<typename T> 
    CLogger& operator<<(const T& t) 
    { 
    push_back(std::to_string(t)); 
    return *this; 
    } 


}; 

您不必創建一個類推,只是超載運營商在第一類中,現在你可以用你的對象使用它:

myCLogger << t; // this would call the function push back

+0

感謝您的編輯。我的CLogger類是我使用本教程創建的單例類:http://www.yolinux.com/TUTORIALS/C++Singleton.html在這種情況下,我嘗試使用'CLogger :: instance () - > myMethodOrMember'。我無法弄清楚如何調用新創建的對象。我想'也許'CLogger ::實例<<「測試」'但沒有... – Bremen