This is my current version. Comments are welcome.
(yes, I removed the previous posts as I did not want to fill this blog with “ Here is verssio n“... Sorry.)

class EnumeratorBase

{

   public:

      bool MoveNext() { return m_e->MoveNext() ; }

      void Reset()    { return m_e->Reset() ; }

 

   protected:

      EnumeratorBase( System::Object * o ) : m_e(static_cast<System::Collections::IEnumerable *>(o)->GetEnumerator()) {}

 

   protected:

      gcroot< System::Collections::IEnumerator * > m_e ;

} ;

 

template <typename T>

class Enumerator : public EnumeratorBase

{

   public:

      Enumerator( System::Object * o ) : EnumeratorBase(o) {}

      T * get_Current() { return __try_cast<T*>(m_e->get_Current()) ; }

} ;

 

template <typename T>

class ValueEnumerator : public EnumeratorBase

{

   public:

      ValueEnumerator( System::Object * o ) : EnumeratorBase(o) {}

      T __box * get_Current() { return dynamic_cast<T __box *>(m_e->get_Current()) ; }

} ;