C++ 为什么std::to_字符串没有std::string重载
标题真的说明了一切。他们为什么选择不拥有一个C++ 为什么std::to_字符串没有std::string重载,c++,c++11,C++,C++11,标题真的说明了一切。他们为什么选择不拥有一个 namespace std { std::string to_string(const std::string&) } 超载 我有一个程序,可以查询一些数据的行索引或行名称;非常适合模板。如果缺少正在访问的行,则在尝试构造错误消息之前: template <typename T> int read(T nameOrIndex) { if (!present(nameOrIndex)) {
namespace std
{
std::string to_string(const std::string&)
}
超载
我有一个程序,可以查询一些数据的行索引或行名称;非常适合模板。如果缺少正在访问的行,则在尝试构造错误消息之前:
template <typename T>
int read(T nameOrIndex)
{
if (!present(nameOrIndex))
{
// This does not compile if T is std::string.
throw std::invalid_argument("Missing row: " + std::to_string(nameOrIndex));
}
}
模板
整型读取(T名称索引)
{
如果(!存在(名称索引))
{
//如果T是std::string,则不会编译。
抛出std::无效的_参数(“缺少行:+std::to_字符串(nameOrIndex));
}
}
我可以将自己的重载添加到
std
名称空间,但这并不理想。与其在std
名称空间中定义自己的重载,不如在std
名称空间中使用std::string
,这是一个非常糟糕的解决方案,只需执行以下操作:
#include <iostream>
#include <string>
std::string to_string(const std::string& value)
{
return value;
}
template <typename T>
void display(T value)
{
using namespace std;
std::cout << to_string(value) << std::endl;
}
int main()
{
display("ABC");
display(7);
}
#包括
#包括
标准::字符串到_字符串(常量标准::字符串和值)
{
返回值;
}
模板
无效显示(T值)
{
使用名称空间std;
std::cout我不想猜测为什么重载不在标准库中,但这里有一个简单的解决方案,您可以使用。使用boost::lexicalcast
而不是std::to_string
template <typename T>
int read(T nameOrIndex)
{
if (!present(nameOrIndex))
{
throw std::invalid_argument {
"Missing row: " + boost::lexical_cast<std::string>(nameOrIndex)
};
}
// …
}
模板
整型读取(T名称索引)
{
如果(!存在(名称索引))
{
抛出std::无效的_参数{
“缺少行:”+boost::词法转换(nameOrIndex)
};
}
// …
}
如果您不想使用Boost依赖项,您可以轻松地为此推出自己的函数
template <typename T>
std::string
to_string(const T& obj)
{
std::ostringstream oss {};
oss << obj;
return oss.str();
}
模板
字符串
to_字符串(常量T&obj)
{
std::ostringstream oss{};
oss由于疏忽,它可能只是丢失了。如果T
也是任意数量的其他类型,那么您的代码将无法编译。那么所有这些类型呢?是否应该有一个to_string
实现,为任意类型返回一些字符串?而不是将to_string
重载添加到std
(这是非法的),我将在与read
相同的命名空间中创建自己的to_string
重载。从中委托给std::to_string
,并按重载的原样返回参数,该重载使用std::string const&
std::to_string
将内置数字类型转换为字符串。没有相应的需要“皈依"字符串到字符串,因为它们已经是字符串。据我所知,to_string
基本上是C格式实用程序的一个安全接口,它向您隐藏缓冲区和所有内容。字符串有一个C格式说明符%s
。因此,显然丢失了一些东西:)@PeteBecker:它将增加一致性和稳定性整体上简化了一些代码。尽管不需要,您也可以将整数转换为整数,例如intx;inty=static\u cast(x)
。此代码不使用ADL,因为参数具有内置类型。相反,display
函数从std
引入名称,因此非限定查找在查找集中同时具有std::to_string
和::to_string
。@M,ADL在这种上下文中是什么意思?