我正在尝试在 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++ 标准(和语言)存在巨大漏洞?我真的很想实现这样的目标。
提前致谢。