Bug in mixins?
Frustrated
Who at where.com
Fri Mar 28 09:28:34 PDT 2014
On Wednesday, 26 March 2014 at 19:29:49 UTC, Artur Skawina wrote:
> On 03/07/14 20:22, Frustrated wrote:
>> On Friday, 7 March 2014 at 09:10:45 UTC, John Colvin wrote:
>>> 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).
>
>
> You can explicitly add the function(s) to the overload set, ie
>
> mixin template some_mixin_templ() {
> void f() {}
> }
>
> struct S {
> mixin some_mixin_templ blah;
>
> void f(int) {}
> alias f = blah.f; // add the one(s) from the mixin
> template
> }
>
> or use a string mixin (which is less problematic inside a
> /mixin/ template):
>
> mixin template some_mixin_templ(string CODE="") {
> void f() {}
> mixin (CODE);
> }
>
> struct S {
> mixin some_mixin_templ!q{
> void f(int) {}
> };
> }
>
> artur
This is not really any better than just using a string mixin
directly. You have to create a named mixin then create the
aliases. In your example, you know the function being mixed in so
it is easy. In my case, the function name was generated by a
string mixin. So I'd basically have to have to mixins, one to
generate the function itself and the other to generate the
aliases, then I've have to call them both in the struct. Much
worse than just passing the typeof(this) to the string mixin.
The only way it could work is if I could use the alias inside the
template mixin and it all work out. In any case, it's a very
convoluted way to achieve what I want(which is simply not having
to pass typeof(this) to the string mixin).
More information about the Digitalmars-d
mailing list