2015-12-21 103 views
2

我想知道實現轉換爲字符串的最佳方式是用於我自己的類。我已經廣泛搜索(並諮詢了一些書籍),但令人驚訝的是,我沒有在任何地方找到任何建議。在我看來,有三種選擇:to_string vs強制轉換爲字符串,而運算符<<

演員串的

內部類的定義: operator std::string() const

std::string to_string(const Obj&)

與此相關的外部類重載:這是尤爲明顯申報班級內部或外部的流媒體運營商<<是否過載?

+0

使用獨立(非成員)函數[在數字類型的標準中](http://en.cppreference.com/w/cpp/string/basic_string/to_string),但如果它「更好「正在進行辯論。 –

+0

至於在哪裏可能的輸出(或輸入)操作符應聲明,這很大程度上取決於他們是否需要成爲班級的朋友。如果他們需要成爲朋友,那麼你必須在班上宣佈他們。還要注意的是,如果你在沒有'friend'說明符的類中聲明瞭一個函數,那麼它就被聲明爲一個成員函數,如果你應該將該對象傳遞給一個輸出運算符,這很可能不是你想要的輸出運算符流。 –

+0

我在原文中沒有寫的是我傾向於to_string,因爲它符合那些標準數字類型。 那麼,如果字符串轉換/流不需要'朋友',最好在課堂外聲明它們? – DanielGr

回答

1

我想說這取決於你想要生成的字符串的類型。如果是用於日誌記錄和調試,我可能會重載<<(ostream&),前提是我的日誌記錄庫支持流(或可以是支持它的模式)。

如果它作爲一個字符串是有意義的而不會讓任何人感到意外(即將到來的string_view就是一個例子),那麼我會做操作員。如果它是一個數字類型(比如一個大整數),或者任何其他類型,因爲任何其他原因需要有一個字符串表示,我會添加一個ToString()函數,無論成員與否。

不會,然而,加std::to_string()超載,因爲我不想潛入std命名空間與我自己的非標準代碼。此外,你甚至不能使用它的ADL上下文,因爲std::to_string()只需要原始操作數。

至於<<(ostream&)運算符,因爲os << myObj不起作用,所以沒有必要將它聲明爲成員函數。你可以做的是將其聲明爲朋友,然後在類聲明中定義它的定義。但是,由於friend關鍵字,這會使其成爲非成員函數。最安全的賭注通常是將其聲明爲朋友,並在源文件中提供實現。

+0

'<<'不會轉換爲字符串。我的問題涉及轉換爲字符串。 (對於流光,我通常會打電話給to_string或者演員陣容,如果有必要的話還可以進一步裝飾)。 – DanielGr

+0

@DanielGr對不起,我暗示了使用'std :: ostringstream'來進行這種轉換是非常習慣的。 –

相關問題