Template class with dispatched properties
Chris Cain
clcain at uncg.edu
Thu Nov 7 18:48:30 PST 2013
On Friday, 8 November 2013 at 02:13:01 UTC, Ross Hays wrote:
> My end goal is to be able to instantiate a vector with a syntax
> like...
> `Vector!(2, float) vec = new Vector!(2, float)();`
>
> ...
>
> Any suggestions?
Greetings,
This works:
---
import std.stdio;
struct Vector(int N, T) if (N <= 3) {
private T[N] data;
public @property
void opDispatch(string fieldName, Args ...)(Args args) if
(Args.length == 1 && fieldName.length == 1 &&
cast(size_t)(fieldName[0] - 'x') < N) {
static immutable offset = cast(size_t)(fieldName[0] - 'x');
data[offset] = args[0];
}
public @property
T opDispatch(string fieldName, Args ...)(Args args) if
(Args.length == 0 && fieldName.length == 1 &&
cast(size_t)(fieldName[0] - 'x') < N) {
static immutable offset = cast(size_t)(fieldName[0] - 'x');
return data[offset];
}
}
void main() {
auto vec = Vector!(2, float)();
vec.x = 1.0;
vec.y = 2.0;
//vec.z = 3.0; // Doesn't compile, as expected for a Vector!(2,
float);
writeln("vec.x = ", vec.x, " and vec.y = ", vec.y);
}
---
Minor tweaks might be necessary, but that should get you started.
More information about the Digitalmars-d-learn
mailing list