C++クラスライブラリでエラー処理の概念を移行する作業を進めています。以前は単純にbool(成功/失敗)を返したメソッドは、機械可読のエラーコードと人間が解読可能な説明(ここでは関係ありません)を伝えるResult
オブジェクトを返すように変更されます。C++:代入演算子を「明示的」にすることはできますか
何千行ものコード行を処理するのはエラーが起こりやすいため、私はこの作業のためにコンパイラから最適なサポートを得ようとします。
マイ結果クラスが持っている - 他のメンバメソッドのうち - コードのコードと代入演算子の結果を構築:
class Result
{
public:
typedef unsigned long ResultCode;
explicit Result(ResultCode code); // (1)
Result& operator=(ResultCode code); // (2)
};
備考:私は通常ResultCode
ため列挙クラスを使用するに私の問題を解決するだろうが、これは選択肢ではない。これは、主な設計目的が異なるライブラリでResult
を使用することでした。各ライブラリは、すべてのライブラリの可能なすべての結果コードを定義する1つの大きなヘッダーファイルを必要とせずに独自の結果コードセットを定義するためです。実際には、各クラスは局所的な結果コードを定義して、可能な結果コードのリストをクラスのヘッダーから取得できるようにしなければならない。したがって、コードはResult
で列挙できません。クラスはResult
クラスを使用して定義する必要があります。クライアントコードで
return true;
書類に暗黙の型変換を避けるために
、コンストラクタは明示的に宣言されています。しかし、ネストメソッド呼び出しでは、別の問題が発生します。私はResult
オブジェクトを返す関数で使用しています方法
bool doSomething()
{
return true;
}
を持っている、と言います。暗黙的に変換される)のdoSomethingのブール戻り値( - 私は、これは私のコンパイラエラーを与えるつもりはない、ネストされた呼び出しResult
の代入演算子の現在の実装では
Result doSomethingElse
{
Result result = doSomething();
return result;
}
の結果コードを転送したいです符号なしlong。
私はC++のドキュメントを読んでいるので、コンストラクタと変換演算子だけを明示的に宣言することができます。
私の質問
- 明示的な代入演算子または他の方法のために許可されていないのはなぜ? IMOでは、どのメソッドも明示的にすることができるようにするのは非常に意味があります。
- 代入演算子の暗黙的な型変換を防ぐ他の解決策がありますか?あなたが投稿したコードに関して
私はそれはあなたが望む答えではないと知っているが、なぜC++の例外メカニズムを使用しないように「キャッチ」何
unsigned int
をされていないのテンプレートoverloadngを使用して、それを強制することができますか?言語と戦わないでください。それを使って作業してください。 (プラス、うまくポーズされた質問のためにプラス)。 – Bathsheba'template void operator =(T)= delete;'を宣言できませんでした。それは通常の場合にそれを使用し、他のすべてのタイプに対して削除されたメソッドを使用しようとします。 –
doug65536
私はそれが可能であるかどうかは分かりませんが、あなた自身がそれを作るのではなく、[システムエラークラス](http://en.cppreference.com/w/cpp/error#System_error)を拡張する可能性があります? –