Multiple alias this is coming.
IgorStepanov via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Fri Sep 19 02:35:38 PDT 2014
On Friday, 19 September 2014 at 05:52:53 UTC, deadalnix wrote:
> On Thursday, 18 September 2014 at 11:20:49 UTC, IgorStepanov
> wrote:
>> I've created pull request, which introduces multiple alias
>> this.
>> https://github.com/D-Programming-Language/dmd/pull/3998
>> Please see the additional tests and comment it.
>
> What is the policy to resolve conflict ?
>
I wrote about that:
>struct Foo
>{
> string s;
> int i;
>
> alias s this;
> alias i this;
>}
>
>Foo f = {"foo", 42};
>string s = f; //s == "foo"
>int i = f; //i == 42
>
>If there are many different ways to resolve alias this then
>error is raised:
>
>struct Bar
>{
> double d;
> int i;
>
> alias d this;
> alias i this;
>}
>
>Foo f = {1.0, 42};
>double d = f; //Error: compiler doesn't know, f.d or f.i do you
>want.
>
>In the next expamle, compiler can resolve conflict:
>
>struct Base1
>{
> int i;
>
> alias i this;
>}
>
>struct Base2
>{
> int i;
>
> alias i this;
>}
>
>struct Derived
>{
> Base1 b1;
> Base2 b2;
> int i;
>
> alias b1 this;
> alias b2 this;
> alias i this;
>}
>
>Derived d = Derived(Base1(1), Base2(2), 3);
>int i = d; //i == 3;
>This done because Derived author know, how to cast his struct to
>int, and if he say alias i this; this alias hide aliases in base
>types.
>
>However, if base type contains alias this to another acceptable
>type, and derived typ hasn't exactly castable alias this then
>error will be raised:
>
>struct Base1
>{
> short s;
>
> alias s this;
>}
>
>struct Base2
>{
> int i;
>
> alias i this;
>}
>
>struct Derived
>{
> Base1 b1;
> Base2 b2;
> int i;
>
> alias b1 this;
> alias b2 this;
> alias i this;
>}
>
>Derived d = Derived(Base1(1), Base2(2), 3);
>int i = d; //Ok i == 3;
>long l = d; //Error: what do you want? d.i or d.b1.s?
More information about the Digitalmars-d-announce
mailing list