2016-11-22 20 views
2

タプル(または同等の異種コンテナ)内のデータをインクリメンタルに収集する、つまりタプルに別の値(およびタイプ)を段階的に追加したいとします。これらの線に沿ってタプルをインクリメンタルに増やす

何かが(名前と構文が作られています)。

growable_tuple tup; 
tup.push_back(42); 
//... 
tup.push_back("Hello"); 
//... 
tup.push_back(' '); 
//... 
tup.push_back("World"s); 

static_assert(4 == std::tuple_size<tup::type>::value); // or 
assert(4 == tup.size()); 

私はstd::tuple_catを使用することができますが、私は、そのような各catのために別のローカル変数にコピーして、結果を格納する必要があります。

std::anyは含まれているタイプがわからないので使用できません。 含まれるタイプのanyを抽出する方法はありますか?

単一このような「挿入」をサポートするローカル変数は、コピーしないことができますか?

ハナにはこのような施設がありますか?

基本的には、後でアクセスできるように型を消去しない異種のコンテナが必要です。
また、挿入がランタイムに依存しない(ランタイムループを挿入しない)と仮定することもできます。
具体的には、タプルに追加されたすべての型(およびインデックス)を指し示すコードを手作業で調べ、これを使用して初期タプルを定義できます。すべてのデータはコンパイル時に存在します。
事前にタプルタイプを手動で指定しなければ、これを行う方法がないのだろうかと思います。

これを実行する明白な方法の1つは、データを徐々にシリアル化して(例:jsonに)、後で再解析することですが、これはやや丸見えです。

+0

予想されるタイプのセットがあらかじめわかっている場合は、 'std :: variant'オブジェクトのコンテナを使用できます。 – Leon

+0

いくつかの擬似コードで何をしたいのか説明できますか? –

+0

@ Reon:いいえ、タプルが必要です。タイプをあらかじめ知っていません。私は例を追加します。 –

答えて

1

驚いたことに、このです。

HOW TO IMPLEMENT A COMPILE-TIME META-CONTAINER IN C++および関連記事を参照してください。もう少し構文的な砂糖があれば、それはOPの機能性を与えることができるはずです。出力と

int main() { 
    using LX = atch::meta_list<class A>; 

    LX::push<void, void, void, void>(); 
    LX::set<0, class Hello>(); 
    LX::set<2, class World>(); 
    LX::pop(); 

    print_type<LX::value<>>(); 
} 


void print_type() [T = atch::type_list<Hello, void, World>]

これはさらに強力なだけリストにタイプを追加するよりも

working codeの例は次のようになります。
私はsmetaライブラリの最終的なリリースを見ていきます。

技術上のadditional postはこちらです。

0

タプルは他のクラスと同様にクラスです。一度宣言されると、それは永遠にそのクラスです。 A

std::tuple<int, char *> 

が宣言されている場合は、常にstd::tuple<int, char *>となります。 C++は静的型付けされた言語です。各オブジェクトの型は宣言されており、既知です。オブジェクトは、ために何が起こっているのだstd::tuple<int, char *>したら、それは何とかstd::tuple<int, char *, char *>

17 C++でになることができない、それは、ある

std::vector<std::any> 

を使用して、このような何かを達成することが可能ですベクトルanyのオブジェクトを作成し、ベクトルにarbiraryオブジェクトを追加します。このオブジェクトのタイプは常にstd::vector<std::any>であり、ベクトルの各値が何であるか把握するために追加の作業が必要になります。

+0

はい、私はこれを知っています。 すべての情報はコンパイル時にわかります。ハナはこれを可能にするためにいくつかの種類の消去(とunerasure)魔法を持っています。 –

+1

C++が静的に型指定された言語であるという基本的な事実を変更する魔法はありません。それは何ですか、そしてどちらも、他のどの図書館もこれを変えることはできません。これはC++の基本的な概念です。実行できる唯一のことは 'std :: any'アプローチです。それだけであなたができることです。 –

関連する問題