为啥数字类型只有一个`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()
取int
,double
等。
【问题讨论】:
只是我的两分钱...但是这些功能太有限了,不值得在 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()`?的主要内容,如果未能解决你的问题,请参考以下文章