2012-10-23 88 views
0

我想知道如何在C++中使用java toString方法來將數據類型轉換爲字符串。例如,以什麼方式可以在C++中擁有以下代碼。C++中的Java ToString方法

public byte[] myMsg = new byte[Length]; 
public int intValue; 
public double doubleValue; 
String out1 = new String(); 
String out2 = new String(); 
String out3 = new String(); 

out1 += ("X; " + Long.toString((intValue& 0x1fffffff) + 0x100000000L, 16).substring(1).toUpperCase() + ";"); 

out2 += (" " + (Integer.toString((this.myMsg[i] & 0xff) + 0x100, 16).substring(1)).toUpperCase()); 

out3 += ("; " + Double.toString(doubleValue)); 

回答

9

是的,C++ 11在std::to_string中引入了類似的東西。

在此之前,你最安全的賭注是使用std::stringstream,與operator <<填充它,並檢索與string.str()

+0

評論downvote? –

+0

+1反擊匿名downvoter的破壞。在我寫這篇評論的時候,這個答案沒有錯。 –

+0

@ Cheersandhth.-Alf,自從我發佈它以來它一直沒有改變。 –

5

C++ 11增加了to_string功能到標準庫;檢查出來

另外,Boost庫有lexical_cast

或者您可以自己編寫,內部使用例如std::ostringstream(來自<sstream>)或C庫的設施。後者通常更高效(實踐中)。

對於您顯示的常規級聯+格式化表達式,您應該考慮一個可以在線性時間內執行此操作的通用格式化程序。

another question's answer中顯示了一個簡單的(不是特別有效或功能豐富的)格式化程序。

3

模板

代碼:

template <typename T> 
std::string toString(const T &val_p) 
{ 
    std::stringstream x; 
    x << val_p; 
    return x.str(); 
} 

這個函數將任何類型的對象轉換爲字符串,前提是適當的ostream插入運算符被定義。要轉換自定義對象,你只是寫一個函數:

代碼:

std::ostream &operator<<(std::ostream &stream_p, const my_class &val_p) 
{ 
    // ... 
    return stream_p; 
} 
+0

**一個改進**:爲了表明意圖是**輸出一個字符串,在上面的'template'中用'std :: ostringstream'替換'std :: stringstream'。請參閱[此問題](http://stackoverflow.com/questions/3292107/whats-the-difference-between-istringstream-ostringstream-and-stringstream-w)進行相關討論。 – DavidRR

2

是的,C++ 11取得了其語言的to_string部分(作爲一個自由函數)。

但是,它不會替代使用ostringstream,並且如果您正在構建大量對象的字符串,最好繼續使用ostringstream而不是將每個項目轉換爲字符串並連接它們。

原因是,當您使用ostringstream時,它將創建一個緩衝區,將輸出寫入其中。當你調用to_string然後連接時,很可能to_string將用它自己的緩衝區創建它自己的ostringstream對象。

如果用戶打算使用operator +連接字符串,這將是非常低效的。如果他們創建一個大的ostringstream開始,你可以直接對對象進行流式處理,而不是先調用to_string。

我實際上預見到這主要用於記錄和異常拋出。在後一種情況下,效率可能並不重要。(我已經看到使用boost的日期時間庫和流的代碼,通常會受到「爲每個打印/解析日期創建新的方面和區域設置」效率低下的問題)我已經修復了我工作過的兩家公司的低效率問題。