我正在尝试在 C++(11) 中实现类似集合类的 .NET 框架。我的问题是无效的协变类型。我有这些课程:
template<typename T>
class IEnumerator
{
public:
virtual bool MoveNext() = 0;
//...
};
template<typename T>
class IEnumerable
{
virtual IEnumerator<T> GetEnumerator() = 0;
};
template<typename T>
class List : public IEnumerable<T>
{
public:
struct Enumerator : public IEnumerator<T>
{
Enumerator(List<T> &list)
{
//...
}
// ...
};
Enumerator GetEnumerator()
{
return Enumerator(*this);
}
};
据我说,这太棒了。但用C++实现似乎不太可能。我通过 g++ 得到“无效的协变返回类型”,据我所知,问题是 GetEnumerator 可能只返回一个指针或对 Enumerator 的引用,而不是 Enumerator 本身的对象。
我想避免返回这样的指针:
Enumerator *GetEnumerator()
{
return new Enumerator(*this);
}
因为我不想让调用者费心删除。使用临时对象,我可以确保该对象被自动删除,因为不再需要它。使用参考文献可能会更糟。
我错过了什么吗?还是 C++ 标准(和语言)存在巨大漏洞?我真的很想实现这样的目标。
提前致谢。
无法实现协变值返回类型。问题是调用者有责任在堆栈中为返回的对象分配空间,并且协变值返回所需的空间量在编译时是未知的。
这与指针/引用无缝配合,因为返回的对象是指针或引用(而不是实际的派生对象),并且大小在编译时已知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)