Thread overview | |||||
---|---|---|---|---|---|
|
September 17, 2020 another question on hidden mixin names | ||||
---|---|---|---|---|
| ||||
I suspect that this is similar to the issue I asked about here: https://forum.dlang.org/post/vukxaqprjbyrdpioukwa@forum.dlang.org, but I can't figure it out. This compiles: --- private mixin template assign(string op_) { ref auto opOpAssign(string op, this RHS)(RHS rhs) if (op == op_) { mixin("x " ~ op ~ "= rhs.x;"); return this; } } struct V { int x; mixin assign!"+"; // mixin assign!"-"; } unittest { auto v = V(2); v += v; assert(v.x == 4); } --- However, if I uncomment the second mixin, there is an error "v is not a scalar, it is a V". I guess I somehow need to merge these overloads, but I don't know how. |
September 17, 2020 Re: another question on hidden mixin names | ||||
---|---|---|---|---|
| ||||
Posted in reply to 60rntogo | On Thursday, 17 September 2020 at 21:05:59 UTC, 60rntogo wrote: > struct V > { > int x; > > mixin assign!"+"; > // mixin assign!"-"; > } > > However, if I uncomment the second mixin, there is an error "v is not a scalar, it is a V". I guess I somehow need to merge these overloads, but I don't know how. Usually, that would be: struct V { int x; mixin assign!"+" a; mixin assign!"-" b; alias opOpAssign = a.opOpAssign; alias opOpAssign = b.opOpAssign; } However, I can't seem to get that working. It seems to be an instance of this issue: https://issues.dlang.org/show_bug.cgi?id=18118 Note that explicitly calling the methods does work: v.opOpAssign!"-"(v); v.opOpAssign!"+"(v); I don't know any good workarounds for this, you'll probably have to write a separate opOpAssign method for V that performs the forwarding to the mixed-in methods. This is, to put it very nicely, not an optimal solution. btw, I'm somewhat surprised by your use of a template this parameter (https://dlang.org/spec/template.html#template_this_parameter). Generally this will work, but you're probably better off with ref auto opOpAssign(string op)(typeof(this) rhs) if (op == op_) -- Simen |
September 17, 2020 Re: another question on hidden mixin names | ||||
---|---|---|---|---|
| ||||
Posted in reply to Simen Kjærås | On Thursday, 17 September 2020 at 22:07:54 UTC, Simen Kjærås wrote: > Usually, that would be: > > struct V { > int x; > > mixin assign!"+" a; > mixin assign!"-" b; > alias opOpAssign = a.opOpAssign; > alias opOpAssign = b.opOpAssign; > } > > However, I can't seem to get that working. It seems to be an instance of this issue: > https://issues.dlang.org/show_bug.cgi?id=18118 Yes, I tried that. It didn't work so I assumed that it must have been wrong. Is this a bug in the compiler or an issue in the language specification? > btw, I'm somewhat surprised by your use of a template this parameter (https://dlang.org/spec/template.html#template_this_parameter). Generally this will work, but you're probably better off with > > ref auto opOpAssign(string op)(typeof(this) rhs) if (op == op_) I learned it from here: http://ddili.org/ders/d.en/mixin.html, could you elaborate on why this is not advisable? |
Copyright © 1999-2021 by the D Language Foundation