在Java中,標準是定義方法toString()
以返回類的字符串表示形式。除了超載operator<<
,在C++中是否有這樣的標準?我知道有std::to_string()
方法來獲得一個數字的字符串表示。 C++標準是否提供了定義方法to_string()
來爲類提供類似的用途,還是C++程序員遵循的慣例?是否有將類轉換爲字符串的標準方式
回答
是否C++標準定義方法to_string()以服務類似的目的的一類說話,
號
或者是有一種常見的做法,接着爲C++程序員。
不。但是,我懷疑每個項目都有類似的功能。名稱和返回類型很可能取決於項目的編碼準則。
在我的工作中,我們使用
virtual QString toString() const = 0;
在我們的基類之一。
您可以開始爲您的項目使用類似的東西。
virtual std::string toString() const = 0;
在您的基類。
執行此類事情的標準方法是提供一個插入運算符,以便可以將對象插入流中 - 可以是任何類型的流,例如串流。
如果您願意,還可以提供一種轉換爲字符串的方法(對插入運算符有用),並且如果您發現轉換可以接受,則可以提供'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也是爲這種事情設計的。
希望這會有所幫助。
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's和Herb 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。
- 1. 將ostream轉換爲標準字符串
- 2. 如何將.NET標準格式字符串轉換爲Excel格式字符串
- 3. 將標準C++字符串轉換爲字符串^
- 4. 在vb.net中將字符串轉換爲datetime的標準格式
- 5. 使用nHibernate標準將字符串轉換爲bool標準
- 6. 將日期字符串轉換爲標準格式?
- 7. C# - 有沒有任何標準的方法將字符串轉換爲json
- 8. 是否有將功能代碼轉換爲命令代碼的標準方式?
- 9. 無法將類型'字符串'隱式轉換爲'字符串'
- 10. 什麼是將字符串轉換爲&str的慣用方式?
- 11. 將多種格式的字符串轉換爲單一標準格式
- 12. 是否可以將字符串轉換爲List數據類型?
- 13. 將類字符串轉換爲類
- 14. 將char向量轉換爲字符串的最有效方式
- 15. ASP.NET中是否有標準格式字符串將1/2/3/...轉換爲1st/2nd/3rd ...?
- 16. 將類轉換爲XML爲字符串
- 17. 將字符串轉換爲TitleWindow的類
- 18. 將字符串轉換爲格式爲
- 19. 將字符串轉換爲模式爲
- 20. 是否有將數組轉換爲字典的聲明方式?
- 21. 將JNI UTF-16字符串轉換爲標準C++ UTF-8字符串
- 22. 將非標準字符轉換爲標準版本
- 23. 將String ^轉換爲標準C++字符串
- 24. 如何使用標準C++將c字符串轉換爲xml?
- 25. 如何將標準輸入轉換爲字符串?
- 26. 如何將字符串轉換爲標準C文件?
- 27. Apache Mod_Rewrite將查詢字符串轉換爲標準url
- 28. 如何將標準timedelta字符串轉換爲timedelta對象
- 29. 是否有任何函數將None轉換爲空字符串?
- 30. 是否有MySQL命令將字符串轉換爲小寫?
似乎需要'toString()'方法的結構會被那些不需要的結構超過。只是我的觀點。 –
你想要這個'* standard *'方法的效果是什麼?在C++中,沒有標準的方法來定義'轉換爲字符串'(這往往不是明智的可能),因此沒有標準的方法來請求這種轉換。 – Walter
沒有什麼能阻止你爲自己的類提供to_string()重載(或者用其他名稱創建一些自己的函數/方法) – deviantfan