是否有相当于C#TryParse的boost lexical_cast
Is there a boost lexical_cast equivalent of C# TryParse?
简介(来自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
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用
- 错误 C2440: 'type cast':无法从 'bool' 转换为 'CString'