虚拟typedef的替代方案

alternative to virtual typedef

本文关键字:方案 typedef 虚拟      更新时间:2023-10-16

我有一个用于List<>模板类的接口IEnumerable,数组<>和Dictionary<>。我希望使用typedef来获得他们的模板类型T.

我希望做以下事情。

class IEnumerable
{
public:
    virtual typedef int TemplateType;
}

然后在继承的成员中重写,但不能创建虚拟typedef。那么,有没有其他方法可以获得未知模板类的类型(IEnumerable不是模板)?

好吧,以下是评论中讨论的内容,以防有人稍后发现同样的问题。

基本上,你想做一些类似于C#的List<>的事情,数组<>,IEnumerable和IEnumerator。但是,您不希望必须创建通用父类Object,因为这可能意味着您每次都需要dynamic_cast。

此外,您不希望将IEnumerable作为模板,因为您不希望在使用集合时必须知道类型。

事实上,使用C++11,可以使IEnumerable成为模板,而不必通过使用隐式类型关键字auto来知道类型,这相当于C#的var关键字的C++11。

所以要做到这一点,你可以做的是:

 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;