有C#TryParse的等价物吗?
简介(来自Eric Lippert博客) : 令人烦恼的异常是不幸的设计决策的结果。 令人烦恼的异常以完全非异常的方式抛出 因此,必须随时抓住和处理 令人烦恼的异常的典型示例是Int32.Parse,它抛出 如果给它一个不能被解析为整数的字符串。但是 此方法99%的用例是转换 用户,这可能是任何旧的东西,因此它不是在任何方式 解析失败的例外情况。更糟糕的是,没有办法解决这个问题 来电者提前确定他们的论点是否正确 没有实现整个方法本身,在这种情况下 一开始就不需要打电话了 现在重要的部分是: 这个不幸的设计决定是如此令人烦恼,当然 框架团队随后不久实现了TryParse 没错 从MSDN Int32.TryParse: 返回值类型:System.Boolean true(如果s已转换) 成功地否则,错误 因此,同事们正在研究一些小的代码,需要检查一个字符串是否是一个数字,所以在考虑它之后,意识到没有好的C++解决方案(基本上它是一个For每个/FixIf或者Boosith:LoistalICAST CAST Ctring catch),我觉得有什么好的,有<代码> iSysReals或是从Boost?有C#TryParse的等价物吗?,c#,c++,exception,boost,C#,C++,Exception,Boost,简介(来自Eric Lippert博客) : 令人烦恼的异常是不幸的设计决策的结果。 令人烦恼的异常以完全非异常的方式抛出 因此,必须随时抓住和处理 令人烦恼的异常的典型示例是Int32.Parse,它抛出 如果给它一个不能被解析为整数的字符串。但是 此方法99%的用例是转换 用户,这可能是任何旧的东西,因此它不是在任何方式 解析失败的例外情况。更糟糕的是,没有办法解决这个问题 来电者提前确定他们的论点是否正确 没有实现整个方法本身,在这种情况下 一开始就不需要打电话了 现在重要的部分是: 这个
Ofc我可以包装boost
lexical_cast
,在try块末尾返回true,在catch块末尾返回false,但我更喜欢现有的实践:)解决方案 老实说,不太可能,据我所知,没有任何方法可以尝试使用词法演员
,但你可以做两件事
Own是使用流并测试提取是否成功,而不是在大多数情况下lexical\u cast
在内部使用流:
std::string str="56.7";
std::istringstream ss(str);
double d;
if(ss >> d) {
//passed
}
else //failed
或者当然,正如你提到的,你可以包装代码> LoCalyOxCase< /Cord>
< P>。所以同事们正在研究一些小的代码,需要检查一个字符串是否是数字,所以在考虑之后,发现没有好的C++解决方案 在C++11中,您有std::stol
和/或std::stod
,它们可以做您需要的事情
更新
如果您不想使用异常,那么strtol(str,&endp)
将进行转换
您可以在调用后检查str==endp
;如果它们相同,则不可能进行转换(因为endp将指向字符串未转换部分的开头)
像这样:
strtol(str, &endp);
if (endp==str) { /* no conversion occurred */ }
如果您可以使用boost,那么您可以使用:
#包括
标准:字符串str(“1.2”);
双res;
if(boost::conversion::try_-lexical_-conversion(str,res)){
//一切正常
}
否则{
//我们有麻烦了
}
作为一个旁白,请注意,尽管埃里克的文章非常有说服力,但它并不是逻辑上一致的:他所描述的作为必要的邪恶(“外生”)的异常实际上是不必要的——只要考虑IO:C++IO流就可以很好地建模这些条件而不使用异常,抱歉,我从来都不关心iostreams(也不理解它们受到的憎恨):D)你是否谈论过它们有好的(),坏的(),。。。功能?本质上是的。默认情况下,它们不是通过异常而是通过标志来表示故障状态,甚至是在NET.IDK中引发“外生”异常的状态,老实说,我更希望在C++中做一种统一的方式,但是TBH没有足够的EXP,带有返回代码/标志/异常,所以我的意见并不重要。您好,正如我在Q中所说,我不喜欢ab/使用try/catch:“Ofc我可以在try块结束时包装boost-u-cast并返回true,在catch块结束时返回false,但我更喜欢现有实践:)解决方案。”如果转换的值超出结果类型的范围,则std::out_超出_范围。在这种情况下,请查看std::strtol
“如果无法执行有效转换,则返回零值(0L)。”,因此isNumber=str==“0”| | strtol(str);,但这对“00”,“000”来说不起作用(您可以检查返回的end_ptr。如果它与传入的指针相同,则不会发生转换。strtol(str,&endp);If(endp==str){}
不会发生转换。
#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
}