1

すべての制御パスがここでコンテナを返すわけではないという事実を回避するにはどうすればよいですか?

        enum Type {Int, String};

        Container containerFactory(Type type)
        {
            switch(type)
            {
            case Int:
                return Container (std::vector<int>());
            case String: 
                return Container (std::vector<std::string>());
            }
        }

更新: ここで例外をキャストできると思っていましたが、無効なTypeを関数に渡すことができないため、これを単体テストすることはできません。

4

3 に答える 3

3

私は下部にを追加する傾向がありassert()ます:

Container containerFactory(Type type)
{
    // ...
    assert( !"Unreachable code hit!" );
    return Container();
}
于 2012-10-08T11:54:00.783 に答える
2

明らかに、無効な値を渡すことはプログラミングエラーです。「私の世界」/ルールブック/その他では、プログラミングエラーは例外ではなくアサーションの失敗を引き起こします。

編集:この理由で、私は実際に少なくとも2つの主要なassertステートメントを持っています。1つはリリースビルドで削除され、もう1つは削除されません。ほとんどの場合、バグがトリガーされた場合に備えてコードにとどまりますが、リリースバージョンでアサーションを実行する価値がない場合は、アサーションのコストが高すぎる場合があります。

コンパイラがアサーションを「戻らないもの」として認識しない場合は、シャットダウンしたいものを何でも返すことができます。呼び出し元が「759843682」の初期化されていない要求から取得することを期待しているコンテナのタイプがわからないため、呼び出しインターフェイスにエラーチェックを追加しない限り、とにかく「適切なリターン」はありません:-)

于 2012-10-08T11:52:52.190 に答える
1

throw、デフォルトでEnumタイプの1つを返すか、。を返しますnull_ptr

于 2012-10-08T11:52:50.737 に答える