是否有一个提升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