On 2012-01-16 12:43, Andrej Mitrovic wrote:
On 1/15/12, Jacob Carlborg<[email protected]> wrote:
I'm not completely sure how it works but it
looks like that Fields mixin can be replace with the code you have
referenced from my Orange library and opDispatch.
You mean your `fieldsOf` template? I'm not really sure how that would
work, I've tried this:
This opBinary(string op)(This rhs)
{
This res;
foreach (field; fieldsOf!This)
{
mixin("res." ~ field ~ " = this." ~ field ~ op ~ " rhs." ~
field ~ ";");
}
return res;
}
But that gives me errors:
Error: variable __aggr901 cannot be read at compile time
Error: variable __aggr901 cannot be read at compile time
Error: variable __key902 cannot be read at compile time
Error: variable __aggr901 cannot be read at compile time
Error: variable __aggr901 cannot be read at compile time
Anyway that Fields mixin was something I wrote as a quick example for
the book. I've also tried using traits(allMembers), but that didn't
work too good.
This compiles and run as expected for me using dmd 2.057:
http://pastebin.com/fq27831F
But I was thinking if the Fields mixin is necessary at all. Since it's
possible to get and set the values of structs and objects using tupleof.
I was thinking it would be possible to use this technique directly in
Notify. Something like this:
struct Notify (T)
{
auto opBinary (string op, T) (T rhs)
{
T result;
foreach (i, dummy ; T.tupleof)
mixin("result.tupleof[i] = raw.tupleof[i] " ~ op ~ "
rhs.tupleof[i];\n");
return result;
}
}
--
/Jacob Carlborg