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

Is there a boost lexical_cast equivalent of C# TryParse?

本文关键字:lexical cast boost 相当于 C#TryParse 是否      更新时间:2023-10-16

简介(来自Eric Lippert博客):

Vexing异常是不幸的设计决策的结果。Vexing异常被抛出在一个完全非异常中情况,因此必须一直抓住并处理。

令人烦恼的异常的典型例子是Int32.Parse,它抛出如果给它一个不能解析为整数的字符串。但是此方法99%的用例是转换用户,这可能是任何旧东西,因此它决不是解析失败的异常情况。更糟糕的是调用方提前确定其论点是否错误而不实现整个方法本身,在这种情况下一开始就不需要叫它。

现在重要的部分:

这个不幸的设计决定非常令人烦恼框架团队在此后不久实现了TryParse正确的事情。

来自MSDN Int32.TryParse:

返回值类型:系统。如果s已转换,则布尔值为true成功地否则为false。

所以同事最近正在编写一些需要检查字符串是否是数字的小代码,所以在思考并意识到没有好的C++解决方案(基本上是for__each/find_if或boost:lexical_cast try-catch)后,我想如果有is_convertible或boost的东西会有多好?

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

如果可以使用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
}

>所以同事最近正在编写一些需要检查字符串是否是数字的小代码,所以在思考并意识到没有好的C++解决方案后

在C++11中,您有std::stol和/或std::stod,它们可以满足您的需要。

更新如果不想使用异常,则strtol(str, &endp)将执行转换。

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

像这样:

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

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

Own是使用流并测试提取是否成功,而不是在大多数情况下lexical_cast在内部使用流:

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

当然,正如你所提到的,你可以包装lexical_cast