2016-03-24 6 views
0

実装されてどのように後押し::ことが可能と次Variadicallyテンプレート構造体には/バリアントが

DifferentTypesInOne<string, int, double> variant_obj; 
あなた variant_objはタイプ文字列、int型の変数を持って

、その中の二重のような効果を達成することです。

私はこれがboost::variantに似ていることを知っています。そして私はこれまでに質問を探しましたが、クラスがバリデーショナルテンプレートを使ってすべてのタイプの要素を格納する方法を説明できる説明につきまとうことはできませんでした。特に、与えられたすべての型の変数を持つstructを定義する方法と、現在どの型が重要かを示すメンバ変数をどのように定義できるかを尋ねています。

ありがとうございます!

+0

バリアントでは、共用体による再帰のいずれか、または記憶域があり、新しい配置を使用します。 –

+0

構造体内のバリデーシックテンプレートリストに含まれる型の要素を、どのようにたくさん持つことができるかを理解するのは難しいです。 – Curious

+0

このコメントは意味がありますか? – Curious

答えて

2

大雑把、

template<class... Ts> 
struct variant_storage {}; 

template<class T, class... Ts> 
struct variant_storage<T, Ts...>{ 
    union { 
     T head; 
     variant_storage<Ts...> tail; 
    }; 
}; 

template<class... Ts> 
struct variant { 
    int index; 
    variant_storage<Ts...> storage; 
}; 

これはスケッチです。詳細はthesearticlesです。

constexpr -nessが不要な場合は、std::aligned_union_t<0, Ts...>を記憶領域として保存し、新しい場所に配置すると簡単です。

+0

これは素晴らしいです。ここで何が起こっているのかを説明できますか? – Curious

+0

@Curious:再帰は、テンプレートメタプログラミング(および一般的なプログラミング)の基本ツールです。 –

+0

再帰ではありません。それは実際の再帰の権利ではないコンパイル時の再帰です – Curious

1

C++ 11では、タイプのリストをとるテンプレートタイプstd::aligned_unionが提供されています。 aligned_union::typeは、与えられたタイプのいずれかのストレージであるために十分なストレージスペースとアライメントを持つタイプです。

データのストレージを作成する方法です。それ以外に必要なのは、そこに格納されている値を示す整数です。あなたは、storageによって提供されるストレージ内に、特定のタイプの個々の要素を割り当てる配置newを使用

template<typename ...Types> 
struct variant 
{ 
private: 
    uint8_t index; 
    typename std::aligned_union<Types...>::type storage; 
}; 

+0

インデックス付き? – Curious

+0

タイプをインデックスとどのように一致させるのを待ちますか? – Curious