#pragma once template class IOpaqueIterator { public: virtual ~IOpaqueIterator() = default; virtual bool HasNext() const = 0; virtual T Next() = 0; }; template class ContainerOpaqueIterator : public IOpaqueIterator { private: typename TContainer::iterator mIter; typename TContainer::const_iterator mEnd; public: ContainerOpaqueIterator(TContainer& container) : mIter{ container.begin() } , mEnd{ container.end() } {} virtual bool HasNext() const override { return mIter != mEnd; } virtual typename TContainer::reference_type Next() override { auto result = *mIter; ++mIter; return result; } };