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在这种上下文中是什么意思?