C++相談室 part48
■ このスレッドは過去ログ倉庫に格納されています
0151デフォルトの名無しさん
2006/03/21(火) 10:53:26そうすりゃ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;
}
■ このスレッドは過去ログ倉庫に格納されています