Required Reading: "How Non-Member Functions Improve Encapsulation"
Dukc
ajieskola at gmail.com
Fri Oct 27 08:28:16 UTC 2017
On Thursday, 26 October 2017 at 12:19:33 UTC, Steven
Schveighoffer wrote:
> D's lookup rules fail miserably when it comes to templates:
>
> mod1.d:
>
> auto callFoo(T)(T t)
> {
> return t.foo;
> }
>
> mod2.d:
>
> struct S
> {
> int x;
> }
>
> int foo(S s) { return s.x * 5; }
>
> void main()
> {
> auto s = S(1);
> assert(s.foo == 5);
> assert(s.callFoo == 5); // can't compile
> }
>
> Would be nice to have a way around this. Not sure what it would
> look like.
Assuming you don't want to change the original struct, this can
be worked around by making a wrapper type using alias this. I
think that's logical because you have to be explicit about which
foreign functions you want the imported algorithm to see. There
would be a function hijacking problem otherwise.
What is the catch here, is that alias this won't solve cases
where the free function takes a reference to the wrapped type or
returns it.
More information about the Digitalmars-d
mailing list