7

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

我希望做以下事情。

class IEnumerable
{
public:
    virtual typedef int TemplateType;
}

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

4

1 回答 1

6

好吧,这是评论中讨论的内容,以防以后有相同问题的人发现这一点。

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

此外,您不想让 IEnumerable 成为模板,因为您不想在使用集合时知道类型。

事实上,使用 C++11,您可以使用隐式类型关键字auto使 IEnumerable 成为模板,而不必知道类型,这是 C++11 等效于 c# 的var关键字。

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

 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 回答