2017-02-17 7 views
2

私はオブジェクト指向の方法で使用できるように、OpenGLの周りに小さなラッパーを作成しています。私はバッファと呼ばれるクラスを作成しました。そのコンストラクタでは、GLenum型の多くに対して渡されたバッファの型を検証したいと思います。ここで、コードの関連部分である:コードスタイル - 可能性のある値に対して整数を検証する方法を教えてください。

​​

このコードでは、switchステートメントが適切な値に、ステップ、およびそれがswitchステートメントから破断するまで、他の有効な値を通過します。他のすべての値はdefault節に入り、例外がスローされます。私は、しかし、またifステートメントを使用することができます

if (type != GL_ARRAY_BUFFER && 
    type != GL_ATOMIC_COUNTER_BUFFER && 
    type != GL_COPY_READ_BUFFER && 
    type != GL_COPY_WRITE_BUFFER && 
    // *** Lots more valid values here... *** 
    ) { 
     throw std::logic_error("Invalid GLenum 'type' in Buffer constructor."); 
    } 

    // ... 
} 

しかし、これはtype !=の繰り返しの多くを使用しており、必ずしも明確ではありません。 コードの明瞭度の速度のために、これを行う際に受け入れられた規則がありますか?私の入力をまったく検証しなければならないのですか?そうしないと、未定義の動作が起こる可能性がありますか?

+0

最初の質問: 'type'値を生成した関数は実際に無効な値を返すことができますか? –

+0

@NeilButterworth 'type'値は一般的にハードコードされていて、関数に依存しませんが、私のクラスメートはこの' class'を使うつもりで、私はドキュメントに従うことができません。 –

+1

http://stackoverflow.com/questions/97987/advantage-of-switch-over-if-else-statementスイッチは、20年前のコンパイラを使用しても効率的なコードを生成する可能性が非常に高いです。 – Olivier

答えて

4

多くの値がある場合、私はstd::setを使用します。

static std::set<int> invalidValues = 
    { GL_ARRAY_BUFFER 
    , GL_ATOMIC_COUNTER_BUFFER 
    , GL_COPY_READ_BUFFER 
    , GL_COPY_WRITE_BUFFER   
    // ... 
    }; 

if(invalidValues.find(type) != invalidValues.end()) { 
    throw std::logic_error("Invalid GLenum 'type' in Buffer constructor."); 
} 

これは、速度と読みやすくするために役立つだろう。

入力を完全に検証する必要がありますか?そうしないと、定義されていない動作が発生する可能性がありますか?

あなたはあなたのプログラムに未定義の動作をしたいことはありません。あなたは、これが例外(クラッシュ)などを引き起こすことに頼ることはできません。

+0

これは私が探していたものです。ありがとう! –

+1

セット内の値をソートする必要がない場合は、 'std :: unordered_set'を使用することを検討し、' std :: find'の結果を実際に使用する必要がない場合は 'std :: any_of'を使用するか、 'std :: none_of' – YoungJohn

+1

@YoungJohnこの場合、' std :: unordered_set'や 'std :: none_of'のように見えます。 –

関連する問題