2017-11-21 21 views
3

ベクターのベクターを構築したいと思います。この質問はすでに多くの時間に掲載されていますが、私は満足のいく回答は見つかりませんでした。異なる種類のベクターのベクター

  • 各ベクトルは異なるタイプ
  • を持つことができる私は、コンパイル時に型を知らない私はそれが含まれていますどのように多くのベクターがわからない

基本的には:そのため私は擬似コードでそのような何かを行うことができるようにしたいと思い 後で

types = ["char", "int", "double", "int"] 
container<vector> x 

foreach (type in types) 
{ 
    if (type == "char") 
    x.push_back(vector<char>) 
    else if (type == "int") 
    x.push_back(vector<int>) 
    else 
    x.push_back(vector<double>) 
} 

とその後、私はboost::anyが私を助けるかもしれないと思うが、私はまだブーストに精通していないよ例

x[0].push_back("a") 
x[1].push_back(1) 
x[2].push_back(3.1416) 

のために行うことができるようにしたいと思います。

奇妙に聞こえても、本当にやりたいことです。私は構造体のベクトルを望んでいない、私は本当に異なるタイプのstd::vectorを含むコンテナ(どちらに関係なく)が欲しいです。私がバイナリファイルを読んでいるからです。ファイルのヘッダーにはデータの数とそのタイプが記述されていますが、ファイルごとに変更できます。したがって、コンパイル時にそれを知ることはできません。

+4

**静的型付けされた**言語は、 'i []がコンパイル時定数式でないとき、' x [i] .push_back(...); – StoryTeller

+2

'boost/std :: variant'を使用してください。 – geza

+2

@geza:OPはコンパイル時に型が分からない場合、バリアントは役に立ちません。 '' any''は良いでしょうが、これは設計上の瑕疵の匂いがします。 – AndyG

答えて

8

おそらく、変異型のベクターを使用できますか?

using ints = std::vector<int>; 
using chars = std::vector<char>; 
using doubles = std::vector<double>; 
using mixed_data_t = std::vector<std::variant<chars, ints, doubles>>; 

各ファイルは、あなたがそれを実行時にあるものを見つけると、適切な変異体ベクターに押し戻すことができ、データの同じ型を持っている場合。ファイルにデータが混在している場合は

あなたは

std::vector<std::vector<std::variant<char, int, double>>>; 

を使用することができますが、それぞれの挿入時に確認する必要があります。

boost::anyは、挿入するたびにタイプ情報が失われるため、探しているソリューションではないと確信しています。

+1

ポイントは、ファイルが標準化されているが、無料の余分なデータを持つことができるということです。ヘッダーにはその内容が明確に述べられていますが、コンパイル時には分かりません。一度だけ私はヘッダーを読んでいます。 – JRR

+0

@JRRバリアントのタイプは実行時に決定されます。実行時のタイプは、テンプレートパラメータとして送信されるタイプによって異なる場合があります。 –

+0

'C++ 17 'をサポートしていることを確認してください。 – PhotometricStereo