标题说明了一切。他们为什么选择没有
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
命名空间,但这并不理想。
答案 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();
}
显然没有优化,但可能对你的情况足够好。