我有一个接口IEnumerable用于List<>,Array<>的模板类和词典<>。我希望使用typedef来获取他们的模板类型T.
我希望做到以下几点。
class IEnumerable
{
public:
virtual typedef int TemplateType;
}
然后覆盖继承的成员,但你不能创建一个虚拟的typedef。那么有没有其他方法可以获得未知模板类的类型(IEnumerable不是模板)?
答案 0 :(得分:5)
嗯,以下是评论中讨论的内容,以防有人提出同样的问题。
基本上,你想要做类似于C#的List<>,Array<&gt ;, IEnumerable和IEnumerator。但是,您不希望创建通用父类Object,因为这可能意味着您每次都需要dynamic_cast。
此外,您不希望将IEnumerable设为模板,因为您不希望在使用该集合时知道该类型。
事实上,使用C ++ 11,可以使IEnumerable成为模板,而不必通过使用隐式类型关键字 auto 来了解类型,这是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;