0

我想知道如何在 C++ 中使用 java toString 方法来将数据类型转换为字符串。例如,通过什么方式可以在 C++ 中使用以下代码。

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));
4

4 回答 4

10

是的,C++11 在std::to_string.

在此之前,您最安全的选择是使用 a std::stringstream,用 填充它,然后用operator <<检索。string.str()

于 2012-10-23T13:01:54.213 回答
5

C++11to_string在标准库中添加了函数;去看一下

此外,Boost 库具有lexical_cast.

std::ostringstream或者您可以在内部使用例如(from <sstream>) 或 C 库的工具编写自己的代码。后者通常更有效(在实践中)。

对于您显示的一般连接 + 格式化表达式,您应该考虑一个可以在线性时间内执行此操作的一般格式化程序。

一个简单的(不是特别有效或功能丰富的)这样的格式化程序在另一个问题的答案中完整显示。

于 2012-10-23T13:03:19.207 回答
4

模板

代码:

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;
}
于 2012-10-23T13:31:34.170 回答
2

是的,C++11 已经成为to_string它语言的一部分(作为一个自由函数)。

但是它不能代替 using ostringstream,如果您正在构建一个包含大量对象的字符串,最好继续使用ostringstream而不是将每个项目转换为字符串并将它们连接起来。

原因是当你使用时ostringstream,它会创建一个缓冲区来写入输出。当您调用to_stringthen concatenate 时,它​​很可能会使用自己的缓冲区to_string创建自己的对象。ostringstream

如果用户要使用 operator+ 来连接字符串,这将是非常低效的。如果他们创建了一个大的 ostringstream 开始,您不妨直接流式传输对象,而不是先在它们上调用 to_string。

我实际上预见到这主要用于日志记录和异常抛出。在后一种情况下,效率可能并不重要。

(我看到使用 boost 的日期时间库和流式传输的代码通常会遭受“为我打印/解析的每个日期创建一个新的方面和语言环境”效率低下的问题。我已经在我工作过的 2 家公司中修复了这种低效率问题)。

于 2012-10-23T15:00:05.770 回答