为什么数字类型只有"to_string()"?
Why there is only a `to_string()` for number types?
我刚刚知道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::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"。有几种方法可以处理 像这样的有问题的专业化案例:
然后他们列出了一些选项(包括忽略问题),其中没有一个会真正令人满意。
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 使用char类型将decimal转换为string,将string转换为decimal
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 将向量解析<string>为字符串
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 如何更改大小(std::string)
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- std::string 的对象真的可以移动吗?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- <string> 使用 for 循环写入向量
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"