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