6

reinterpret_castのトピックについて書かれた行がたくさんあり、それがどれほど悪いか、特にfstreamからの読み取りや書き込みなどの関数を扱う場合は、それを回避するための最善の方法にまだ戸惑っています。だから、ここに私のジレンマがあります...

ファイルからのデータを入力したい整数配列があるとしましょう。

std::ifstream iFile( ... );

// presume that the type of this array is not a matter of choice
int *a = new int[ 100 ]; 

いくつかの異なるキャストで読むことができます:

iFile.read( (char *)a, sizeof( int ) * 100 );
iFile.read( reinterpret_cast< char * >( a ), sizeof( int ) * 100 );
iFile.read( static_cast< char * >( static_cast< void * >( ( a ) ), sizeof( int ) * 100 );

最初のもの(Cスタイル)は時代遅れであり、正当な理由でC++で導入された新しいスタイルのキャストです。2つ目は移植性がなく、保証はありません。3つ目は、書くのが面倒で、楽しみを台無しにします。

これに代わるものはありますか?どうすればよいですか?

編集:

目標は、コードを可能な限り移植可能で標準に準拠するようにすることです。

4

1 に答える 1

5

代わりに、次のように宣言aしてみませんか。char*

//int *a = new int[100]; 
char *a = new char[100];
iFile.read(a, 100 ); 

現在、キャストは必要ありません。


編集:

さて、私はあなたのコメントとあなたの投稿のコメントされた行を読みました。その場合:

iFile.read(reinterpret_cast<char*>(a), sizeof(int)*100);

十分なはずです。

ただし、私は個人的にCスタイルのキャストを選択します。

iFile.read((char*)a, sizeof(int)*100);

ここに危険がないからです。Cスタイルのキャストでもすべてがうまくいくようです!


最高でありながら退屈なキャスト

この関数テンプレートを定義します。

template<class To, class From>
To any_cast(From v)
{
    return static_cast<To>(static_cast<void*>(v));
}

次にそれを使用します:

//`From` type will be inferred from the function argument. :-) 
iFile.read(any_cast<char*>(a), sizeof(int)*100);

いいね?

any_castこれは、あらゆるタイプからあらゆるタイプへのキャストに使用できると思います。

于 2011-01-12T19:20:47.187 に答える