为什么std :: to_string没有std :: string重载

时间:2016-04-12 22:26:03

标签: c++ c++11

标题说明了一切。他们为什么选择没有

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));
    }
}

我可以将自己的重载添加到std命名空间,但这并不理想。

2 个答案:

答案 0 :(得分:12)

而不是在std::string命名空间中定义自己的重载std,这是一个非常糟糕的解决方案,而是执行此操作:

#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);
}

答案 1 :(得分:1)

我不会猜测为什么重载不在标准库中,但这是一个可以使用的简单解决方案。而不是std::to_string,请使用boost::lexical_cast

template <typename T>
int read(T nameOrIndex)
{
  if (!present(nameOrIndex))
    {
      throw std::invalid_argument {
          "Missing row: " + boost::lexical_cast<std::string>(nameOrIndex)
      };
    }
  // …
}

如果你不想要Boost依赖,你可以轻松地为此推出自己的功能。

template <typename T>
std::string
to_string(const T& obj)
{
  std::ostringstream oss {};
  oss << obj;
  return oss.str();
}

显然没有优化,但可能对你的情况足够好。