入力引数が範囲外の場合に例外がスローされる可能性のあるいくつかのことを実行する小さなライブラリを作成しています。std::out_of_rangeをスローするのは簡単なようです。
また、「Xを指定しましたが、Yは範囲内の最大値です」などのメッセージを生成したいと思います。つまり、文字列をフォーマットしていて、それを例外に使用したいと思います。
奇妙なのは、コンストラクターの署名が
explicit out_of_range (const string& what_arg)
つまり、文字列へのconst参照を取ります。スタック上に作成した文字列は、関数から飛び出すときに破棄され、例外のキャッチャーのためにゴミの山が壊れたままになります。だから私にはいくつかの選択肢しかありません:
- 文字列リテラルを使用するので、適切に生成されたメッセージはありません。プログラムの存続期間中有効です。
- 関数内で文字列を静的にし、スローされたときに書き直します。スレッドセーフは私のプログラムの問題ではありませんが、これはかなり汚い感じがします。
- 文字列のコピーを取得するようにout_of_rangeをサブクラス化し、コピーへの参照を使用してスーパークラスコンストラクターを呼び出し、例外オブジェクトの存続期間中コピーが存在するようにします。
とにかく標準クラスを直接使用するよりも、グロスが最も少なく、おそらくより良い設計として3に傾いていますが、質問する必要があります。生成された文字列で標準のout_of_rangeクラスを直接使用する方法は本当にありませんか?私は何かが足りないのですか?