2016-05-04 9 views
0

私はC++でファイルを解析するクラスを作成しようとしています。 しかし、ファイルは実際には2つのファイル、ヘッダーと生データにあります。C++の不明な変数型です。テンプレートを使うべきですか?

ヘッダーには生データのデータ型が含まれます(int、double、floatなど)。 生データを格納するクラスに変数を作成したいと思います。 データタイプに関係なく、処理は同じになります。

これを行うにはテンプレートを使用する必要がありますか? 1つの変数だけテンプレート化されたクラスを使用するのは残念ですか?

ありがとうございます。

+0

'これを行うにはテンプレートを使用する必要がありますか? 「あなたの前の他の選択肢は何ですか? – sjsam

+0

私は分かりません。たぶんvoidポインタを宣言し、必要なメモリを割り当て、生データをコピーして、データ型にポインタの基底をキャストするだけです。 それは本当にきれいではありませんが、ただ1つの変数が最適でないテンプレートを使用するように感じます。それは...ですか ? – whiteShadow

+1

'boost :: variant' - ホイールを再開発する必要はありません。 –

答えて

1

テンプレートは確かにここでお手伝いします。これらは、すべてのタイプで同じ処理の繰り返しを減らす方法を提供します。

「使用すべきかどうか」ということは、残念なことですがどちらも意見の問題ですが、一般的な使用はただ1つの変数の使用がそれを決める。

異なるタイプを含むファイルの内容を同じコンテナに処理する必要がある場合、またはファイルに複数のタイプが含まれる場合は、多分ブーストバリアントが適しています。

ファイルから型を読み込むので、これらの型は実行時に認識されますが、コンパイル時にオプションのリストがわかっているので、ファイルの型をチェックして型を渡すことができます。

if(typeFromFile == headerValueForint) 
{ 
    processFile<int>(); 
} 
else if (typeFromFile == headerValueFordouble) 
{ 
    processFile<double>(); 
} 

しかし、あなたが一覧表示すべてのタイプが数値です(と私は、他の非数値型があるかどう処理は実際には同じことができるか疑問に思う)として、あなたはダブルスとしてのすべての値を読み取るために決めることができました - と適切な範囲チェック。より多くのメモリを消費するかもしれませんが、その影響は処理に実際に関係するものによって異なります。

+0

私は、ディメンションの数、各ディメンションのサイズ、データのタイプなどを教えてくれるヘッダファイルを持っています。 次に、私が読んだバイナリファイル(生データ)があります。これらの情報。簡単にするために、ヘッダーを読み込み、すべての生データを格納する配列(適切な型、サイズ、サイズなど)を作成したいので、ファイルを一度読み込むだけで済みます。配列内のデータにアクセスすることができます。だから、コンパイル時には、配列のサイズや型は本当にわかりませんが、私は実行時にそれを知っています。 – whiteShadow

+0

これは私のサンプルコードが示すものです。正しいタイプのテンプレートコードを呼び出すランタイムチェック。実際の呼び出しはおそらくいくつかのパラメータを取るので、おそらく私の例とは異なります。コレクションのサイズは、実行時に簡単に設定できます。 – ROX

+0

オハイオ州、私はあなたが提案したものを誤解しました。それは確か私の最初の計画でしたが、テンプレート化された変数を1つだけ作成するための新しいテンプレート化クラスを作成することをお勧めしませんでした。ありがとう:) – whiteShadow

2

使用については関数オーバーロード?あなたは処理が同じだと言ったので、あなたはできると思います。私は時々この種のものをするためにそれらを使用します。

例:

HEADER.H

class MyClass { 
public: 
    void function(int x); 
    void function(double x); 
    void function(string x); 
    void function(char x); 
}; 

コンパイラは、あなたがそれに(通過)を送信している値に応じて、使用するどのような機能を知っているだろう。

+0

いくつかのサブ関数を呼び出す必要がある場合は問題ありませんか?おそらく、あまりにもそれらをオーバーロードする必要がありますか? 私のデータに座標(get(x、y、z))でアクセスする必要があるとしたら、データ型ごとに関数を作成する必要があります。 私は、テンプレート化されたクラスが実際にはもっと楽になると思い始めます。ありがとう。 – whiteShadow

+0

処理が同じであるとすれば、オーバーロードされた関数オプションは(ほぼ)繰り返しになり、パラメータxの型がどこに現れるかがそれぞれ異なります。これはまさにテンプレートがあなたを助ける場所です - その "どんな入力タイプでも"コードをテンプレートパラメータに置き換えて、すべてのバージョンを同じソースコードで実装できるようにすることです。 – ROX

+0

問題は、これらのデータを保存する必要があることです。私は大きなテキストファイルを読んでいます。効率を上げるために、これらのデータを変数に格納してから処理していきたいと思います。私は、処理が何であるかはまだ正確にはわかりません。 もっと具体的には、データの次元、データ型などが異なるファイルを解析するプログラムを作成しています。 たとえば、ある地域の平均値を計算したいと思うすべてをオーバーロードするのではなく、値を含むテンプレート付き配列とテンプレート化された平均化関数を持つことです。 – whiteShadow

関連する問題