Listing 3: move_next() helper function.

template< typename T >
bool move_next( T & var, IEnumerator * pEnum )
{
    if ( ! pEnum->MoveNext() )
        return false;
    var = __try_cast<T>( pEnum->Current );
    return true;
}