異種コンテナを作成する方法C ++
-
13-09-2020 - |
質問
私は(名前、値)の形で一連のデータポイントを保存する必要があります。値は異なる型を取ります。
データポイントごとにクラステンプレートを使用しようとしています。次に、わたしのデータポイントごとに、新しいオブジェクトを作成してベクトルに戻します。新しいタイプごとに、最初にテンプレートから新しいクラスを作成する必要があります。しかし、ベクトルはすべてのエントリに対して同じタイプを予想するので、私は任意のベクトルで作成されたオブジェクトを保存することはできません。保存する必要がある型は、継承階層に適合することはできません。それらは無関係です。また、将来作成されたタイプが多くなる可能性があり、新しいタイプごとにストレージサービスを変更したくありません。これらのエントリを保存するために異種のコンテナを作成する方法はありますか? ありがとうございました!
解決
ブーストライブラリはおそらくあなたが探しているものを持っています(Boost :: Any)。Boost ...
を使用できない場合は、ラップされたポインタアプローチを使用して自分のものを転がすことができます。他のヒント
boost::any
はすでに推奨されていますが、それは何のためであるので、あなたはそれから多くを期待することはできません。
早くさまざまな種類を知っている場合は、boost::variant
を使用しているのが良いです。
typedef boost::variant<Foo, Bar, Joe> variant_type;
struct Print: boost::static_visitor<>
{
void operator()(Foo const& f) const { f.print(std::cout); }
template <class T>
void operator()(T const& t) const { std::cout << t << '\n'; }
};
void func(variant_type const& v) // not template
{
boost::apply_visitor(Print(), v); // compile-time checking
// that all types are handled
}
. コンテナの問題は、コンテナ内の何かにアクセスしたい場合は、そのタイプを特定してから実際のタイプにキャストする必要があるということです。これは醜く、非効率的でエラーが発生しやすいです。>
ペア(タイプ、void *)を持っているだけで、ペアの中に記述されているタイプに応じてvoid *をキャストし、次にあなたの目に合ったものにこれらを突き刺すことができると考えていました。