是否有一个提升lexical_cast相当于C#TryParse?
简介(来自Eric Lippert博客):
不幸的例外是不幸的设计决定的结果。 在完全非特殊情况下抛出exception情况,因此必须始终抓住并处理。
一个令人烦恼的exception的典型例子是Int32.Parse,如果你给它一个无法解析为整数的字符串,它会抛出。 但是这个方法的99%用例是转换用户输入的字符串,这可能是任何旧的东西,因此解析失败绝不是例外。 更糟糕的是,如果没有自己实现整个方法,调用者就无法提前确定他们的参数是否是坏的,在这种情况下,他们不需要首先调用它。
现在重要的部分:
这个不幸的设计决定非常令人烦恼,当然框架团队很快就会实施TryParse,这样做是正确的。
来自MSDN Int32.TryParse:
返回值类型:System.Boolean如果s已成功转换,则为true;否则为false。 否则,是的。
所以同事们正在研究一些需要检查一个字符串是否为数字的代码,所以在考虑它并意识到没有好的C ++解决方案之后(基本上它是for__each / find_if或boost:lexical_cast try catch)我想拥有is_convertible
或者来自boost的东西会有多好?
我可以包装boost lexical_cast
并在try块结束时返回true并在catch块结束时返回false但我更喜欢现有的做法:)解决方案。
如果你可以使用boost,那么你可以使用boost::conversion::try_lexical_convert
:
#include std::string str("1.2"); double res; if(boost::conversion::try_lexical_convert(str, res)){ //everything normal } else{ //we got a problem }
>所以同事们正在研究一些需要检查字符串是否为数字的代码,以便在考虑它并意识到没有好的C ++解决方案之后
在C ++ 11中,你有std::stol
和/或std::stod
,它std::stol
你的需要。
更新如果您不想使用exception,则strtol(str, &endp)
将执行转换。
您可以在通话后检查str == endp
; 如果它们是相同的,那么就不可能进行转换(因为endp将指向字符串未转换部分的开头)
像这样:
strtol(str, &endp); if (endp==str) { /* no conversion occurred */ }
不是说实话,据我所知,没有try_lexical_cast
但你可以做两件事。
自己使用流和测试提取成功,而不是在大多数情况下lexical_cast
无论如何在内部使用流:
std::string str="56.7"; std::istringstream ss(str); double d; if(ss >> d) { //passed } else //failed
或者当然,如你所说,你可以包装lexical_cast