std::vector<boost::variant<int,somestruct,...>> v;
v.push_back(1);
v.push_back(({1, 2, 3});
a = boost::get<int>(v[0]);
宣言時にどの型を処理する必要があるのかをご存じの場合は、
- ジェームズ・観世オフセットのベクトルを維持することがboost::any
に非常に似ていると私はあなたが本当に、よりコンパクトにすることができるかわからない、言ったようにJohannesDがboost::variant
影響各要素の大きさが、 を言ったように
を編集。
厳密な要件に応じて、別の解決方法が役立ちます。 各タイプごとに異なるコンテナを内部的に格納しますが、複数のベクトルを直接使用するよりもはるかに優れているわけではありませんが、格納されている最後のいくつかの要素のような余分な情報を格納できます。あなたはまだ一箇所にすべてのものを持っています。以下のよう
何か:あなたがマップによってベクトルを交換するため、要素IDを覚えることができる。もちろん、
template <template <class,class> class C, typename T, typename ...Args>
struct map_ { //FIXME: return a list of type C<T1>,C<T2>...
};
template <template <class...> class C, typename ...Args>
struct fill_ { // Hack to parametrize map by Args on GCC 4.6
typedef T<Args> type;
};
template <typename... Ts>
struct hvec
{
std::map<std::string,fill_<boost::variant,map_<std::vector,Ts>> vec_map;
std::size_t last_id;
std::string last_typeid;
template <typename T>
T get(std::size_t i)
{
std::vector<T>& v = vec_map[typeid(T).name];
return vec[i];
}
template <typename T>
std::size_t push_back(const T& e)
{
std::vector<T>& v = vec_map[typeid(T).name];
v.push_back(e);
}
};
、これはあなたの要件を満たすが、余分なコストを追加し、まだ一つの要素によって「アドレス」/キーを意味します。ただし、この場合、指定されたオフセットで要素の型を覚える必要はありません。
ブーストの[Any](http://www.boost.org/doc/libs/1_49_0/doc/html/any.html)と[Variant](http://www.boost.org /doc/libs/1_49_0/doc/html/variant.html) – megabyte1024
@ megabyte1024:私が言ったように、私の現在の解決策ですが、それぞれが線形ストレージに対する大きなオーバーヘッドであるポインタを持っています。 – Dani
Qtを使用している場合はQVariantを使用してください。 Any-Type-Variableを最初に作成すること(Any、Variant、QVariant)に集中して、これをベクトルに入れることは、単にその型のstd :: vectorを使うことです。 – Patrick