为什么数字类型只有"to_string()"?

Why there is only a `to_string()` for number types?

本文关键字:quot string to 类型 为什么 数字      更新时间:2023-10-16

我刚刚知道C++在<string>中定义了std::to_string()。现在我想知道为什么to_string()仅适用于数字类型。有什么特别的原因,为什么没有更一般的

template <typename T>
std::string to_string(const T& t);

可以这样实现:

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

我怀疑这种一般to_string不存在,因为自己写很容易,但同样的论点也适用于to_string()采取intdouble等。

因为std::to_string()要求。

正如标准所述:

string to_string(int val);

string to_string(unsigned val);

string to_string(long val);

string to_string(unsigned long val);

string to_string(long long val);

string to_string(unsigned long long val);

string to_string(float val);

string to_string(double val);

string to_string(long double val);

返回:每个函数返回一个包含字符的字符串对象 表示其参数的值,该值将由 调用 sprintf(buf, fmt, val) 的格式说明符为 "%d", "%u", 分别为"%ld"、"%lu"、"%lld"、"%llu"、"%f"、"%f"或"%Lf">, 其中 buf 指定足够大小的内部字符缓冲区。

编写一个模板化函数来确定需要用于std::sprintf的说明符会使事情变得不必要地复杂。

只是想添加到 Sombrero 鸡回答我在此提案中发现的内容(感谢@DAle的链接)。

该提案是关于添加一个通用to_string方法。原理与我的天真实现相同:在后台使用流从任何可以流式传输的对象获取字符串。

由于该提案是在 c++11 之后提出的,因此添加这样的方法将对现有to_string产生影响,在"对标准的影响"一节中,他们写道:

[...]新旧函数可以共存,依赖于重载 在 匹配参数类型。但是,兼容性问题可能会出现在 一些不同但隐式可转换的参数类型的情况:

to_string(0);     // before: calls to_string(int), now: calls to_string(int)
to_string(false); // before: calls to_string(int), now: calls to_string<bool>(bool&&)
to_string('0');   // before: calls to_string(int), now: calls to_string<char>(char&&)

虽然前两种情况下的效果是相同的(结果是 总是"0"),在最后一个中,结果将从"48"更改 (假设 ASCII 编码)为"0"。有几种方法可以处理 像这样的有问题的专业化案例:

然后他们列出了一些选项(包括忽略问题),其中没有一个会真正令人满意。