2015-10-26 90 views
8

在Java中,標準是定義方法toString()以返回類的字符串表示形式。除了超載operator<<,在C++中是否有這樣的標準?我知道有std::to_string()方法來獲得一個數字的字符串表示。 C++標準是否提供了定義方法to_string()來爲類提供類似的用途,還是C++程序員遵循的慣例?是否有將類轉換爲字符串的標準方式

+0

似乎需要'toString()'方法的結構會被那些不需要的結構超過。只是我的觀點。 –

+0

你想要這個'* standard *'方法的效果是什麼?在C++中,沒有標準的方法來定義'轉換爲字符串'(這往往不是明智的可能),因此沒有標準的方法來請求這種轉換。 – Walter

+0

沒有什麼能阻止你爲自己的類提供to_string()重載(或者用其他名稱創建一些自己的函數/方法) – deviantfan

回答

1

是否C++標準定義方法to_string()以服務類似的目的的一類說話,

或者是有一種常見的做法,接着爲C++程序員。

不。但是,我懷疑每個項目都有類似的功能。名稱和返回類型很可能取決於項目的編碼準則。

在我的工作中,我們使用

virtual QString toString() const = 0; 

在我們的基類之一。

您可以開始爲您的項目使用類似的東西。

virtual std::string toString() const = 0; 

在您的基類。

5

執行此類事情的標準方法是提供一個插入運算符,以便可以將對象插入流中 - 可以是任何類型的流,例如串流。

如果您願意,還可以提供一種轉換爲字符串的方法(對插入運算符有用),並且如果您發現轉換可以接受,則可以提供'to string'運算符。

這裏是我的標準「點」類的例子:

template <typename T> 
struct point 
{ 
    T x; 
    T y; 
    point(): x(), y() { } 
    point(T x, T y): x(x), y(y) { } 
}; 

template <typename T> 
std::ostream& operator << (std::ostream& outs, const point <T> & p) 
{ 
    return outs << "(" << p.x << "," << p.y << ")"; 
} 

我也傾向於保持一個方便的功能,周圍的東西轉換成字符串:

template <typename T> 
std::string to_string(const T& value) 
{ 
    std::ostringstream ss; 
    ss << value; 
    return ss.str(); 
} 

現在,我可以輕鬆地使用它:

int main() 
{ 
    point p (2,-7); 

    std::cout << "I have a point at " << p << ".\n"; 

    my_fn_which_takes_a_string(to_string(p)); 

你會發現Boost Lexical Cast Library也是爲這種事情設計的。

希望這會有所幫助。

4

C++標準沒有規定的方式做到這一點,但它看起來像有可能引入它說的動機部分,其還強調採取了目前常見的做法(我表現出這樣的選項Generic to_string/to_wstring functions的建議下面):

在很長一段時間C++程序員一直在尋找一種簡單的方法來轉換 對象到其字符串表示。 這個問題的典型答案是創建一個本地ostringstream,將對象 插入到流中,然後獲得結果字符串str 成員函數。這個解決方案簡單,安全,靈活,並且可擴展,但對於某些相當 應該是單個函數調用的應用來說,這個解決方案確實太冗長了。 C++ 11以一組重載的to_string/to_wstring函數提供(部分) 解決方案。不幸的是,這些僅限於內置的 數字類型。 也存在非標準解決方案 - 最值得注意的是 boost :: lexical_cast,它提供對象和 字符串的雙向轉換,但缺少任何格式控制

本文提出了一種解決方案,它:

  • 概括現有to_string/to_wstring功能的任何類型的,它提供了流輸出操作者和任何的basic_string 專業化,
  • 保持一致,大致與這些兼容功能
  • 提供了額外的格式化和連接功能,
  • 通過構建熟悉的ostringstream解決方案在概念上很簡單。

有兩個旅行報告STL'sHerb Sutter's,我沒有看到在任一提到這個文件。所以希望這將在post-Kona郵件發佈時涵蓋。

他們在提案看起來像the example in this answer提到的第一種方法:

class A { 
public: 
    int i; 
}; 

std::ostream& operator<<(std::ostream &strm, const A &a) { 
    return strm << "A(" << a.i << ")"; 
} 

類似的例子from here的東西結合:

template <typename T> 
std::string to_string(const T& value) { 
    std::ostringstream os; 
    os << value; 
    return os.str(); 
} 

我們可以找到一個boost::lexical_cast例子問題Enabling Classes for Use with boost::lexical_cast

相關問題