为啥数字类型只有一个`to_string()`?

Posted

技术标签:

【中文标题】为啥数字类型只有一个`to_string()`?【英文标题】:Why there is only a `to_string()` for number types?为什么数字类型只有一个`to_string()`? 【发布时间】:2017-04-13 20:11:55 【问题描述】:

我刚刚知道 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... 像 Boost.Format 或 lexical_cast 这样的东西会很多,我的意思是很多更有用。这些 to_string 函数非常基础,仅在最基本的场景中有用,这意味着它们在现实生活中毫无用处。 不要被一票否决。可能只是一个人度过了糟糕的一天。 其实有一个关于这个问题的提案open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0117r0.html,但不认为有时间会被接受 @DAle 你为什么不认为它会被接受?恕我直言,我每次都必须手动创建一个流,这是一个主要的烦恼,它可以很容易地修复 @DAle “对标准的影响”部分提到了提供更通用功能会出现问题的一个很好的理由。可惜to_string() 现在已经成为标准 【参考方案1】:

因为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);

返回:每个函数都返回一个保存字符的字符串对象 将由以下方式生成的参数值的表示 使用格式说明符“%d”、“%u”调用 sprintf(buf, fmt, val), 分别为“%ld”、“%lu”、“%lld”、“%llu”、“%f”、“%f”或“%Lf”, 其中 buf 指定一个足够大的内部字符缓冲区。

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

【讨论】:

【参考方案2】:

只想将我在this proposal 中找到的内容添加到Sombrero Chickens answer(感谢@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”。有几种方法可以处理 像这样有问题的专业化案例:

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

【讨论】:

以上是关于为啥数字类型只有一个`to_string()`?的主要内容,如果未能解决你的问题,请参考以下文章

string与int的相互转换

Dataframe.to_string() 问题

excel 超过15位为啥显示0

to_string()的应用

为啥这个数组的第 0 个索引仍然不等于 0?

oracle数据库表中某个字段设置为NUMBER(10,2),为啥在页面只能输入6位整数,只有超过6位就报错