巡回用のイテレータを作れば?
そうすりゃalgorithmも適用できるから2重にお得

#include<iostream>
struct C { 
    int x;struct Y {int y1, y2;} y;int z;
    struct iterator{
        C*c;int&(**pos)(C*);
        explicit iterator(C*c,int&(**pos)(C*)):c(c),pos(pos){}
        int&operator*(){return (*pos)(c);}iterator&operator++(){++pos;return*this;}
        friend bool operator!=(iterator a,iterator b){return a.c!=b.c||a.pos!=b.pos;}
    };
    iterator begin();
    iterator end();
}; 
namespace{int&Cx(C*c){return c->x;}int&Cy1(C*c){return c->y.y1;}
int&Cy2(C*c){return c->y.y2;}int&Cz(C*c){return c->z;}
int&(*table[])(C*)={Cx,Cy1,Cy2,Cz};}
C::iterator C::begin(){return C::iterator(this,table);}
C::iterator C::end(){return C::iterator(this,table+sizeof(table)/sizeof(table[0]));}
int main() 
{ 
    C c = {1,{2, 3},4 };
    C::iterator it = c.begin(),end=c.end();
    //for_each + ostream_iteratorでも可
    for (;it != end;++it) 
        std::cout << *it << std::endl; 
    return 0; 
}