Hi!
Andrey Tarasevich schrieb:
> For example, consider this code sample
>
> struct A { int a; }
>
> struct B {
> int x;
> int y;
> A a;
> int z[10];
> };
>
> void zero(B* b, unsigned n, int B::*m) {
> for (; n > 0; --n, ++b)
> b->*m = 0;
> }
>
> Now, I can use the above simple 'zero' function I can set to zero any
> immediate member of all 'B' objects in an array
>
> B b[10];
>
> zero(b, 10, &B:
); // sets all 'B:
's to zero
> zero(b, 10, &B::y); // sets all 'B::y's to zero
typedef int& (*BIntMember) (B*);
void zero(B*const b, unsigned const n, BIntMember const m) {
for(; n>0; --n, ++b)
m(b) = 0;
}
int& B_x(B*const b) { return b->x; }
int& B_y(B*const b) { return b->y; }
int& B_a_a(B*const b) { return b->a.a; }
B b[10];
zero(b, 10, &B_x);
zero(b, 10, &B_y);
zero(b, 10, &B_a_a);
OR using boost.lambda:
for_each(b, b+10, bind(&B_x, _1) = 0);
for_each(b, b+10, bind(&B_x, _1)++);
....
Frank