虚拟typedef的替代品

Sel*_*rio 5 c++ polymorphism templates typedef

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

我希望做到以下几点.

class IEnumerable
{
public:
    virtual typedef int TemplateType;
}
Run Code Online (Sandbox Code Playgroud)

然后覆盖继承的成员,但你不能创建一个虚拟的typedef.那么有没有其他方法可以获得未知模板类的类型(IEnumerable不是模板)?

tha*_*ang 5

好吧,这里是评论中讨论的内容,以防有人在后来发现这个问题.

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

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

事实上,C++ 11,你可以做IEnumerable的模板,而不必使用隐式类型关键字知道是什么类型的汽车,这是C++ 11等价的C#的的变种关键字.

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

 template <class T>
 class IEnumerable { 
     public:
        virtual IEnumerator<T> getEnumerator() = 0; 
        // and more stuff
 }
Run Code Online (Sandbox Code Playgroud)

然后

  template <class T>
  class List : public IEnumerable<T> { 

  public:
         virtual IEnumerator<T> getEnumerator() { 
               return ListEnumerator<T>(this); 
         }
  }
Run Code Online (Sandbox Code Playgroud)

  template <class T>
  class ListEnumerator : public IEnumerator<T> { 
  public:
        T getNext();   // or something to this effect
        // and more stuff
  }
Run Code Online (Sandbox Code Playgroud)

最后,在使用它时,您可以:

  List<int> myList;


  auto i = myList.getEnumerator();
  int z = i.getNext()+1;
Run Code Online (Sandbox Code Playgroud)