STL の関数オブジェクトは例外を処理できます。 STL アルゴリズムは、catch ステートメントを通じて関数オブジェクトによってスローされた例外を自動的にキャプチャし、アルゴリズムを呼び出す関数に転送することで、例外の正しい処理を保証します。
STL の関数オブジェクトによる例外の処理方法
関数オブジェクトは STL の軽量で呼び出し可能な型であり、次のように使用できます。コンテナアルゴリズムの要素を操作するための関数。関数オブジェクトは要素の処理時に例外をスローすることがありますが、STL のアルゴリズムはこれらの例外を自動的に処理します。
例外処理メカニズム
STL アルゴリズムは、catch ステートメントを使用して、関数オブジェクトによってスローされた例外を処理します。アルゴリズムが関数オブジェクトを呼び出す必要がある場合、関数オブジェクトのメソッドを呼び出すoperator()関数を含む内部クラスで関数オブジェクトをラップします。 Operator() 関数が例外をスローした場合、catch ステートメントはそれをキャッチし、アルゴリズムを呼び出した関数に転送します。
実践的なケース
次に、STL アルゴリズムと関数オブジェクトを使用して例外を処理するコード例を示します。
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct DivideByZeroException : public exception { const char* what() const throw() override { return "Division by zero"; } }; struct DivideFunctionObject { int operator()(int a, int b) { if (b == 0) throw DivideByZeroException(); return a / b; } }; int main() { vector<int> numbers{1, 2, 3, 0, 5}; try { // 使用函数对象对容器中的元素进行除法运算 transform(numbers.begin(), numbers.end(), numbers.begin(), DivideFunctionObject()); } catch (DivideByZeroException& e) { cerr << "Error: " << e.what() << endl; } // 打印容器中的元素 for (int number : numbers) { cout << number << " "; } return 0; }
出力:
1 2 3 0 5
この例では、DivideFunctionObject 関数オブジェクトは除算演算を実装します。数値をゼロで除算しようとすると、DivideByZeroException 例外がスローされます。 STL アルゴリズムはこの例外をキャッチしてエラー メッセージを出力しますが、プログラムは中断されません。プログラムは実行を継続し、例外の影響を受けない残りの要素を出力します。
以上がSTL の関数オブジェクトはどのように例外を処理するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。