On Saturday, 30 May 2015 at 14:23:37 UTC, Marc Schütz wrote:
Something like this?
struct S {
static int[] a_;
static float[] b_;
const size_t idx;
@property ref int a() { return a_[idx]; }
@property ref float b() { return b_[idx]; }
void opAssign(const S other) {
a_[idx] = a_[other.idx];
b_[idx] = b_[other.idx];
}
// opSliceAssign() ...
}
// ... initialize S.a_ and S.b_ here ...
auto s = S(200); // 200th entry
writefln("a = %s, b = %s", s.a, s.b);
You can then simply iterate over S.a_ directly. With some UDA
and mixin template magic, the accessors can be generated
automatically.
Of course, depending on what you're actually trying to do with
it, other abstractions may be more useful to support your
typical access patterns.
Yes, kind of. The template should be able to generate the
accessors using the fields of the struct passed as template
argument. But also a special accessor wich returns all the items
accessors, in a structured way:
---
struct Model
{
uint a, b;
}
template Structured(T)
{
alias Structured = ...;
}
---
allowing things like:
---
Structured!Model sm;
sm[0].a = 0;
sm[0].b = 0;
auto item = sm[0];
sm.a = 0;
sm.pushBack;
auto item = sm.back;
sm.length += 1,
---
etc.