虚拟typedef的替代方案
alternative to virtual typedef
我有一个用于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;
相关文章:
- C++:TypeDef使用元组
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 为什么在使用typedef时类推导指南会失败
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 尝试根据类中 typedef 的存在来专门化模板函数
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- typedef 枚举和枚举类有什么区别?
- 使用模板的条件typedef的更干净的替代方案
- 使用强typedef作为Boost参数库的更轻量级的替代方案
- 虚拟typedef的替代方案