为什么没有std::from_string()函数?

12
为什么没有?
template <typename T>
T std::from_string(const std::string& s);

在C++标准中有没有类似于std::to_string()函数的东西?(我是说,既然有这个函数)。
PS-如果你对为什么没有采用/考虑这个想法有任何想法,请回答/评论并说明原因,而不要给负评。我并不是在提议将其纳入标准。

5
"дёәд»Җд№Ҳstd::stoзі»еҲ—дёҚжҳҜдёҖдёӘжЁЎжқҝпјҹ" жҲ–и®ёдјҡеј•иө·жӮЁзҡ„е…ҙи¶ЈгҖӮ - Quentin
2
@einpoklum: “那不是同一件事。” …为什么不是呢? - Nicol Bolas
3
“我不理解为什么会有人踩这个问题。这个问题提得很好,也是合法的。” 不,不是这样。回答会是“论点”,而不是“事实”。 - Nicol Bolas
2
@einpoklum: "1. 单个模板函数。2. 不限于数字类型。" to_string 系列不是模板函数。并且它们仅限于数字类型。 请注意,您不能向 std 命名空间添加 重载 - Nicol Bolas
4
@NicolBolas:答案应该是标准委员会所做考虑的解释。 - einpoklum
显示剩余12条评论
2个回答

3
正如Nicol Bolas所指出的那样,to_string从来不是一个模板,而只是一组重载函数。将这样的函数变成模板并不好,因为通用化可能并不高效,并且只能像字符串流一样运行。同样地,from_string也不应该是函数模板,而应该是简单的函数。由于它们的参数是相同的类型(std::string),它们的名称不应该相同。因此,stoistof等都是你想要的。

to_stringsto*在区域设置方面的行为也类似:它们都遵循当前的C语言环境。相反,C++ IOStreams不受C语言环境的影响。只有当它们在通过std::locale::global设置C++全局区域设置之后创建,或手动使用不同的区域设置imbue时,它们才能被覆盖。


1

std::to_string() 有一个更加严格的规定:它由一组明确定义的非模板化重载组成,每个重载都具有可轻松转换为字符串的类型。因此,很容易定义这些函数应该做什么。

你提出的 std::from_string() 更加广泛。它会涉及到诸如错误处理和精度设置等棘手的问题。已经可用的流函数可以完成这种工作,可能已经足够了。


1
为什么这比使用operator>>和istreams更棘手? - einpoklum
3
输入流(istream)的各种修改器可以调整精度和进制,将其封装在一个单一的函数中可能很困难。 - Bathsheba
1
你的第一段正是我看到这个问题时想到的,除了过于基于个人观点/广泛之外...所以给+1。我的第二个想法是@einpoklum只想要boost::lexical_cast。由于委员会经常从Boost中借鉴东西,因此在评估他们是否考虑了这一点时,有一个非常好的搜索术语,正如问题评论中所讨论的那样。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接