0

キャストについてちょっと質問です。

基本的に、私は次のコードを持っています:

//Array of ALbyte, size is irrelevant
ALbyte buffer[1000];
//...
alcCaptureSamples(m_audioDevice,(ALCvoid*)buffer, sample);

Scott Meyers の効果的な C++ のアドバイスに基づいて、これには C++ スタイルのキャストを使用したいと思います。

reinterpret_cast<ALCvoid*>しかし、とのどちらを選択すればよいか、よくわかりませんstatic_cast<ALCvoid*>。彼らは、ポインターを別のポインター型に変換するために使用されるMSDNで言います。reinterpret_cast

しかし、Effective C++では、私は読みました

reinterpret_cast実装に依存する (つまり、移植できない) 結果を生成する低レベルのキャストを対象としています。たとえば、ポインタを int にキャストします。

そして、これらは非常にまれであるべきです。

では、どのキャストを選べばいいでしょうか?私は明らかに排除const_castdynamic_castましたが、残りのどれを使用する必要があるかを判断できません... (固定サイズの配列をポインターにキャストしたいという事実がわからないため、この質問は実際には役に立ちませんでしたタイプが OpenAL に影響するかどうか)。

または、この場合、C++ スタイルのキャストを完全に回避する必要があります (しかし、なぜですか) ?

4

2 に答える 2

3

この場合、おそらくキャストを行う必要はありません。

配列は自然にポインターに減衰すること、およびすべてのポインターを暗黙的にキャストできることを覚えておいてくださいvoid*(私ALCvoid*はそうだと思います)。

于 2013-06-19T13:42:39.280 に答える
0

static_castコンパイル時のチェックを実行するため、可能な限り使用する必要があります。コンパイラは、無効なポインター型へのキャストを許可しません。

reinterpret_castconstto以外のコンパイル時チェックは実行できませんnon-const。を必要とする古いインターフェイスでプログラミングしない限り、めったに使用されませんvoid*

ただし、キャストを行う必要がないようにコードを設計することをお勧めします。ポリモーフィズムを調査することで、キャストを回避できます。

于 2013-06-19T13:39:11.423 に答える