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 *GetEnumerator()
{
return new Enumerator(*this);
}
発信者にわざわざ削除してほしくないからです。一時オブジェクトを使用すると、オブジェクトは不要になったため、自動的に削除されます。参照の使用はさらに悪い場合があります。
私は何かが足りないのですか?それとも、C ++標準(および言語)に大きな穴がありますか?本当にこういうことを成し遂げたいです。
前もって感謝します。