我有一个用于 List<>、Array<> 和 Dictionary<> 模板类的 IEnumerable 接口(interface)。我希望使用 typedef 来获得他们的模板化类型 T。
我希望做以下事情。
class IEnumerable
{
public:
virtual typedef int TemplateType;
}
然后在继承的成员中覆盖,但是你不能创建一个虚拟类型定义。那么有没有其他方法可以获得未知模板类的类型(IEnumerable 不是模板)?
最佳答案
好吧,这里是评论中讨论的内容,以防有相同问题的人后来发现这一点。
基本上,您想做一些类似于 C# 的 List<>、Array<>、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;
关于c++ - 替代虚拟类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14741442/