2011-12-08 23 views
7

私は以下のテンプレート関数を使って、任意の標準型のデータをバイナリ出力ストリームにダンプします。cスタイルのキャストとreinterpret_castの比較

template<typename T> static void 
dump (const T& v, ostream& o) { 
    o.write (reinterpret_cast<const char*>(&v), sizeof(T)); 
} 

reinterpret_castではなく、Cスタイル(const char *)を使用することもできます。 reinterpret_castを使用する特別な理由はありますか?私は、reinterpret_castがびっくりしたいくつかの他の投稿を読んでいます。しかし、上記の使用法は合法であり、他のものに置き換えることはできません。

おかげ

+0

私はあなたがその結果を知っていると思います(同じアーキテクチャで同じコンパイラで同じオプションでコンパイルされたプログラムでしか結果のファイルを読み取ることができません)。 – curiousguy

+0

誰かが私にこのことを言ってもらうつもりですが、Cスタイルのキャストを使用したいと思うなら、あなたはいつも見逃せないジェネリック・ラジカルなコメントを残すことができます。 Cであなたの 'const'を見つける方法もいくつかありました。 ¯| _(ツ))_ |¯もちろん、危険に気をつけるべきです。 –

答えて

10

Cスタイルのキャストの問題点は、ボンネットの下に多くを行うことです。詳細な説明については、ここを参照してください。http://anteru.net/2007/12/18/200/

C++キャストを常に使用するようにしてください。長期的にはより簡単に生活できます。この場合のCスタイルのキャストの主な問題は、reinterpret_cast(char*)(&v)と書くことができるということです。追加のconst_castが必要なので、少し安全です。さらに、Cスタイルのキャストでは不可能な正規表現を使ってreinterpret_castを簡単に見つけることができます。

+2

あなたは 'reinterpret_cast'のために本格的な正規表現を必要としません。単純なテキスト検索(ほとんどのエディタで良い"検索 ")で十分です:) –

+3

Args、yes。私はあなたがCスタイルのキャストのために正規表現することができないことを始めました、そして、文は逆に巻かれました;) – Anteru

+0

すべてのキャストを見つけたいですか? – curiousguy

1

reinterpret_castは、static_castまたはdynamic_castの代わりに使用されたときにぼやけています。それを使用してCキャストを置き換えることをお勧めします。

新しいキャストはCスタイルのキャストよりも利点があります。 1つは、あなたが実際に望むものを制限することができます。もう1つは、新しいキャストのテキスト検索をCキャストよりも簡単に行うことです。

+1

「新しいキャストをテキスト検索する」_あなたはどのくらいの頻度でそれを行っていますか? – curiousguy

+0

@curiousguy:私はそれを数回やった。私はキャストから何かを得たことをほとんど気にしませんが、私はキャスト操作を含むことがわかった特定のステップを取ったことに気付きます。私はキャストを探しているわけではありません*、私はキャストを使用して知っている何か他のものを探しています。 –

4

違いはありません。与えられた状況では、Cスタイルのキャストはまさに「再解釈」のキャストです。

C++スタイルのキャストを好むべき理由は、それらがキャストしているものについて明示的なであるということです。 Cスタイルのキャストは、必要に応じて可能な限り重いキャストにフォールバックしようとしますが、C++スタイルのキャストは、意図したとおりにコンパイルできるだけです:スタティックキャストは、値が変換可能かポインタ/参照const-castは、sourceとtargetが互いのcv修飾バージョンである場合にのみ動作します。 reinterpret-castは、基本となるバイナリ表現を調べることを明示的に示します。 (有効な再解釈キャストは通常​​、 voidまたはchar-pointerであることに注意してください)。

+0

"有効なreinterpret-castsは通常void-()pointer_"にしかならないことを注意してください。なぜあなたは 'void *'にキャストしたいのですか? – curiousguy

+0

@curiousguy:placement-new ... –

+0

ここでは 'reinterpret_cast'は必要ありません。 'static_cast'は問題ありません。 (私は標準の 'implicit_cast'が好きだったでしょう) – curiousguy

3

Cスタイルのキャストは非常に危険です。そこでC++では、一般的な使用法に基づいて、以下の型にキャストを分割しました。

dynamic_cast(expression) - 適切なクラス階層間でのキャストが可能です。

const_cast(expression) - 定数をキャストします。

static_cast(expression) - エクステントCスタイルでも、型間の非互換性は依然として尊重されています。

reinterpret_cast(式) - 要件が満たされていない場合は、これも使用できます。 Cスタイルのキャスティングではなく、名前付きです。したがって、大きなコードベースで簡単に見つけることができます。

注: - ほとんどの "reinterpret_cast"は、適切なデザインで削除することができます。言い換えれば、 "reinterpret_cast"が必要です。ほとんどの場合、設計上何かが間違っている可能性があります。

更新: これは最後のオプションである必要があり、上記の場合、使用法は正しいです。 reinterpret_castに言及すると、意図的にライターがタイプセーフティを気にしないという印象を読者に与えます。しかし、Cスタイルのキャストを使用してもその印象を与えることはありません。

+0

しかし、上記のコードで使われているreinterpret_castは非常に簡単で、あなたの再設計ノートには適格ではないと思いますか? – shekhar

+0

私が言及したように、これは最後のオプションでなければならず、上記の場合、使用法は正しいです。 reinterpret_castに言及すると、意図的にライターがタイプセーフティを気にしないという印象を読者に与えます。しかし、Cスタイルのキャストを使用してもその印象を与えることはありません。 – rakesh

関連する問題