2012-10-23 69 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的日期时间库和流的代码,通常会受到“为每个打印/解析日期创建新的方面和区域设置”效率低下的问题)我已经修复了我工作过的两家公司的低效率问题。