Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有C#TryParse的等价物吗?_C#_C++_Exception_Boost - Fatal编程技术网

有C#TryParse的等价物吗?

有C#TryParse的等价物吗?,c#,c++,exception,boost,C#,C++,Exception,Boost,简介(来自Eric Lippert博客) : 令人烦恼的异常是不幸的设计决策的结果。 令人烦恼的异常以完全非异常的方式抛出 因此,必须随时抓住和处理 令人烦恼的异常的典型示例是Int32.Parse,它抛出 如果给它一个不能被解析为整数的字符串。但是 此方法99%的用例是转换 用户,这可能是任何旧的东西,因此它不是在任何方式 解析失败的例外情况。更糟糕的是,没有办法解决这个问题 来电者提前确定他们的论点是否正确 没有实现整个方法本身,在这种情况下 一开始就不需要打电话了 现在重要的部分是: 这个

简介(来自Eric Lippert博客) :

令人烦恼的异常是不幸的设计决策的结果。 令人烦恼的异常以完全非异常的方式抛出 因此,必须随时抓住和处理

令人烦恼的异常的典型示例是Int32.Parse,它抛出 如果给它一个不能被解析为整数的字符串。但是 此方法99%的用例是转换 用户,这可能是任何旧的东西,因此它不是在任何方式 解析失败的例外情况。更糟糕的是,没有办法解决这个问题 来电者提前确定他们的论点是否正确 没有实现整个方法本身,在这种情况下 一开始就不需要打电话了

现在重要的部分是:

这个不幸的设计决定是如此令人烦恼,当然 框架团队随后不久实现了TryParse 没错

从MSDN Int32.TryParse:

返回值类型:System.Boolean true(如果s已转换) 成功地否则,错误

因此,同事们正在研究一些小的代码,需要检查一个字符串是否是一个数字,所以在考虑它之后,意识到没有好的C++解决方案(基本上它是一个For每个/FixIf或者Boosith:LoistalICAST CAST Ctring catch),我觉得有什么好的,有<代码> iSysReals或是从Boost?
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
}