是否有相当于 C# TryParse 的 boost lexical_cast?

NoS*_*tAl 5 c# c++ boost exception

介绍(来自 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 我可以包装 boostlexical_cast并在 try 块的末尾返回 true 并在 catch 块的末尾返回 false 但我更喜欢现有的做法:) 解决方案。

ead*_*ead 5

如果您可以使用 boost,那么您可以使用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
}
Run Code Online (Sandbox Code Playgroud)