2017-04-13 41 views
5

我刚刚才知道C++在<string>中定义了std::to_string()。现在我想知道为什么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()采取intdouble,等等。

+0

只是我的两分钱......但是这些功能太有限了,不值得在std里面......像Boost.Format或lexical_cast这样的东西会很多,我的意思是更有用。这些to_string函数非常基本,只在最基本的场景中有用,这意味着它们在现实生活中是无用的。 – rubenvb

+7

不要被一票抛弃。可能只是一个糟糕的一天。 –

+3

其实,有关于这个问题的建议http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0117r0.html,但不要以为有人会接受 – DAle

回答

4

由于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);

返回:每个函数返回一个字符串对象保持将由 主叫来生成其自变量的值的字符 表示带格式说明符“%d”,“%u”的sprintf(buf,fmt,val), , 其中,buf表示内部字符缓冲区充足,其中“%ld”,“%lu”,“%lld”,“%llu”,“尺寸。

编写一个可以确定需要使用的说明符的模板化函数使得事情不必要的复杂化。

3

只是想添加到Gill Bates answer我发现在this proposal(感谢@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”。有几种方法来处理 问题的专业化情况下,像这样:

然后他们列出一些选项(包括忽略的问题)出的这恕我直言,没有人会真正令人满意。 Imho它的可惜,to_string,因为它首先将它制作成标准。另一方面,吉尔贝茨的答案给出了一个很好的理由,为什么它从一开始就不是通用的(如果它应该生成字符串,就好像sprintf被使用,它通常不是微不足道的,也许是不可能的)。

相关问题