5

イントロ(Eric Lippertブログから):

厄介な例外は、不幸な設計上の決定の結果です。厄介な例外は、完全に例外ではない状況でスローされるため、常にキャッチして処理する必要があります。

厄介な例外の典型的な例はInt32.Parseです。これは、整数として解析できない文字列を指定するとスローされます。ただし、このメソッドの99%のユースケースは、ユーザーが入力した文字列を変換することです。これは古いものである可能性があるため、解析が失敗することは決して例外ではありません。さらに悪いことに、呼び出し元は、メソッド全体を実装せずに引数が悪いかどうかを事前に判断する方法はありません。その場合、最初に呼び出す必要はありません。

ここで重要な部分:

この不幸な設計上の決定は非常に厄介だったので、もちろんフレームワークチームはその後すぐにTryParseを実装しました。これは正しいことを行います。

MSDN Int32.TryParseから:

戻り値タイプ:System.Booleansが正常に変換された場合はtrue。それ以外の場合はfalse。

そのため、同僚は最近、文字列が数字かどうかを確認する必要のある小さなコードに取り組んでいたので、それについて考えて、良いC ++ソリューションがないことに気付いた後(基本的にはfor__each / find_ifまたはboost:lexical_cast try catchです)is_convertibleブーストから何かを持っているとどれほど素晴らしいでしょうか?

多くの場合、ブーストlexical_castをラップして、tryブロックの最後でtrueを返し、catchブロックの最後でfalseを返すことができますが、既存のプラクティスを好みます:)ソリューション。

4

3 に答える 3

4

>それで、同僚は最近、文字列が数字であるかどうかをチェックする必要のある小さなコードに取り組んでいたので、それについて考えて、良いC++ソリューションがないことに気づきました

C ++ 11にはstd::stol、および/またはstd::stodがあり、必要なことを実行できます。

更新 例外を使用したくない場合strtol(str, &endp)は、変換を行います。

str == endp通話後に確認できます。それらが同じである場合、変換は不可能でした(endpは文字列の変換されていない部分の先頭を指すため)

このような:

strtol(str, &endp);
if (endp==str) { /* no conversion occurred */ }
于 2012-11-28T17:05:42.673 に答える
4

ブーストを使用できる場合は、次を使用できます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
}
于 2017-02-23T15:02:50.763 に答える
-1

実はそうではありませんが、正直なところ、私が知る限り、try_lexical_castあなたにできることは2つあります。

独自にストリームを使用し、抽出が成功したことをテストします。ほとんどの場合、lexical_cast内部でストリームを使用するわけではありません。

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

またはもちろん、あなたが言うようにあなたは包むことができますlexical_cast

于 2012-11-28T10:33:20.680 に答える