なぜあなたがこれをしたいのか疑問に思う必要があります。学術的/実験的な目的でこれを行い、それを破棄する計画を立てていない限り、あなたは自分で仕事をしていて、言語とSTLの機能を使用した場合よりも問題に対して脆弱なコードになってしまうことはほぼ確実です。すでに提供しています。Cでは、おそらくこれを行う必要がありますが、C ++では、言語サポートがあるため、これを行う必要はありません。
あなたがしていることには2つの側面があります:ある定義された方法で一般的に使用できる任意のタイプの要素を持つことと、それらの要素を一緒に集めることです。そうすれば、最初の側面は多形性によって簡単に達成できます。共通インターフェースを定義する抽象基本クラスを作成します。
struct BaseElement { virtual void doSomething( ); };
次に、これから、要素が実行していることをカバーする構造体を導出できます。
struct DerivedElement1 : public BaseElement { void doSomething( ); };
struct DerivedElement2 : public BaseElement { void doSomething( ); };
タイプをまとめるには、STLベクトルを使用するだけです。私が見る限り、それはあなたが必要とするすべてのものを提供します。非常に簡単な例として、次のようにすることができます。
// Convenient shorthand.
typedef std::vector< std::shared_ptr<BaseElement> > MyElements;
MyElements m;
// Create two different but commonly derived objects.
std::shared_ptr<DerivedElement1> e1(new DerivedElement1);
std::shared_ptr<DerivedElement2> e2(new DerivedElement2);
// Push them onto the collection.
m.push_back( e1.static_pointer_cast<BaseElement>( e1 ) );
m.push_back( e2.static_pointer_cast<BaseElement>( e2 ) );
この時点で、必要なものはすべて揃っています。begin()
Vectorは、end()
などの標準機能を提供しますsize()
。これは、必要に応じて、コレクションをトラバースし、コレクションでSTLアルゴリズムを実行するのに役立ちます。コレクションが多態的であるという事実は、doSomething()
その構造体に対して定義されたものだけを実行することを知っている各要素で実行できることを意味します。
(私はC ++ 11コンパイラにアクセスしていないので、誰かがここで私を迎えてくれると確信しています。ただし、生のポインタを使用しても、C++11より前のコードで同じことが簡単に達成できます。 'オブジェクトを適切にクリアするように注意してください。)
これがあなたが直接望んでいた答えではないことは知っていますが、単に捨てる例で学ぼうとしているのでない限り、ほとんどの場合、すでにあるものを使用する方が速く、短く、安全で、信頼性が高いことを強調したいと思います。