Bug in mixins?
Frustrated
Frustrated at nowhere.com
Fri Mar 7 11:22:52 PST 2014
On Friday, 7 March 2014 at 09:10:45 UTC, John Colvin wrote:
> On Friday, 7 March 2014 at 06:23:58 UTC, Frustrated wrote:
>> Can someone check this out? The best I can acertain is that
>> the mixin template isn't adding the generated functions
>> because it thinks they are already in the class.
>>
>> i.e., the code generates the following methods
>>
>> @property iButton button(iButton b)
>> @property iBorder border(iBorder b)
>>
>> and the class contains the methods
>>
>> @property WindowsButton button()
>> @property WindowsButton button(WindowsButton b)
>>
>> and the template mixin simply doesn't add the generic methods.
>> (simply because mixing the string mixin directly works,
>> wrapping it in a mixin template does not)
>>
>> Using that I created a MWE:
>>
>> http://dpaste.dzfl.pl/6f64e49aba95
>>
>>
>>
>> import std.stdio, std.cstream;
>>
>> // mixin template used to wrap the string mixin
>> mixin template C() { mixin(B); }
>>
>> // eponymously named template used as a string mixin to
>> generate the function
>> template B()
>> {
>> string B() { return "void foo(iA a) { writeln(`Generic`);
>> }"; }
>> }
>>
>> interface iA { void foo(iA a); }
>>
>> class A : iA
>> {
>> void foo(A a) { writeln("Specific"); }
>> //mixin(B);
>> mixin C; // doesn't work, use line above, does not insert
>> generic foo
>> }
>>
>>
>> void main()
>> {
>> iA a = new A;
>> a.foo(a);
>> (cast(A)a).foo(cast(A)a);
>> (cast(A)a).foo(a); // line doesn't work when using mixin
>> template because the generic foo does not exist
>> }
>>
>>
>> This seems like a bug to me but maybe that's how mixin
>> templates work? If so is there any way to make them insert the
>> code regardless if it thinks they are the same? (they are not
>> in this case and I need to use them to reduce redundancy)
>
> functions introduced through mixin templates do not take part
> in overload resolution when an overload exists outside the
> mixin.
> It's a common annoyance, I can't remember if there's a good
> reason for it.
This seems to be the problem. The mixin thinks they are the same
function so it doesn't insert it. I guess it just looks at the
name rather than the complete signature. Would be real nice if
that wasn't the case or if one could chose the behavior. I can
see in some cases it being nice to have the current behavior but
not all(specifically talking about overloads).
More information about the Digitalmars-d
mailing list