7

List<>、Array<>、および Dictionary<> のテンプレート クラス用のインターフェイス IEnumerable があります。typedef を使用して、テンプレート化された型 T を取得したいと考えていました。

私は次のことを望んでいました。

class IEnumerable
{
public:
    virtual typedef int TemplateType;
}

そして、継承されたメンバーでオーバーライドしますが、仮想 typedef を作成することはできません。では、不明なテンプレート クラスの型を取得できる他の方法はありますか (IEnumerable はテンプレートではありません)。

4

1 に答える 1

6

さて、同じ質問を持つ誰かが後でこれを見つけた場合に備えて、コメントで議論されていることは次のとおりです.

基本的に、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;
于 2013-02-07T02:35:23.600 に答える