是否有一个提升lexical_cast相当于C#TryParse?

时间:2012-11-28 10:19:46

标签: c# c++ exception boost

简介(来自Eric Lippert博客) :

  

不幸的例外是不幸的设计决定的结果。   令人烦恼的例外情况完全不同寻常   环境,因此必须始终抓住并处理。

     

一个令人烦恼的异常的典型例子是Int32.Parse,它抛出   如果你给它一个无法解析为整数的字符串。但是   此方法的99%用例正在转换由字符串输入的字符串   用户,可能是任何旧东西,因此绝不是   解析失败的特殊情况。更糟糕的是,没有办法   调用者提前确定他们的论点是否不好   没有实现整个方法本身,在这种情况下他们   不需要首先调用它。

现在重要的部分:

  

这个不幸的设计决定当然令人烦恼   框架团队此后不久实施了TryParse   对的。

来自MSDN Int32.TryParse:

  

返回值类型:System.Boolean如果转换了s,则为true   成功;否则,错误。

所以同事们正在研究一些需要检查一个字符串是否为数字的代码,所以在考虑它并意识到没有好的C ++解决方案之后(基本上它是for__each / find_if或boost:lexical_cast try catch我觉得有is_convertible或者来自boost的东西会有多好?

Ofc我可以包装boost lexical_cast并在try块结束时返回true并在catch块结束时返回false但我更喜欢现有的实践:)解决方案。

3 个答案:

答案 0 :(得分:3)

>因此,同事们正在研究一些需要检查字符串是否为数字的代码,因此在考虑它并意识到没有好的C ++解决方案之后

在C ++ 11中,您有std::stol和/或std::stod,这可能会满足您的需求。

更新 如果您不想使用例外,那么strtol(str, &endp)将进行转换。

您可以在通话后检查str == endp是否有效;如果它们是相同的,则不可能进行转换(因为endp将指向字符串未转换部分的开头)

像这样:

strtol(str, &endp);
if (endp==str) { /* no conversion occurred */ }

答案 1 :(得分:1)

如果你可以使用提升,那么你可以使用boost::conversion::try_lexical_convert

#include <boost/lexical_cast/try_lexical_convert.hpp>

std::string str("1.2");
double res;
if(boost::conversion::try_lexical_convert<double>(str, res)){
   //everything normal
}
else{
   //we got a problem
}

答案 2 :(得分:0)

不是说实话,据我所知,没有try_lexical_cast,但你可以做两件事。

自己使用流和测试提取成功,而不是在大多数情况下lexical_cast无论如何都在内部使用流:

 std::string str="56.7";
 std::istringstream ss(str);
 double d;
 if(ss >> d) {
     //passed
 }
 else //failed

当然,如你所说,你可以包裹lexical_cast