さて、同じ質問を持つ誰かが後でこれを見つけた場合に備えて、コメントで議論されていることは次のとおりです.
基本的に、C# の List<>、Array<>、IEnumerable、および IEnumerator と同様のことを行います。ただし、毎回 dynamic_cast が必要になる可能性があるため、一般的な親クラス Object を作成する必要はありません。
さらに、コレクションを使用するときに型を知る必要がないため、IEnumerable をテンプレートにしたくありません。
実際、C++11 では、C# のvarキーワードと同等の C++11 である暗黙の型キーワードautoを使用して、IEnumerable をテンプレートにすることができ、型を知る必要はありません。
これを行うには、次のことができます。
template <class T>
class IEnumerable {
public:
virtual IEnumerator<T> getEnumerator() = 0;
// and more stuff
}
それから
template <class T>
class List : public IEnumerable<T> {
public:
virtual IEnumerator<T> getEnumerator() {
return ListEnumerator<T>(this);
}
}
と
template <class T>
class ListEnumerator : public IEnumerator<T> {
public:
T getNext(); // or something to this effect
// and more stuff
}
最後に、それを使用することになると、次のことができます。
List<int> myList;
auto i = myList.getEnumerator();
int z = i.getNext()+1;