Thread overview
Forward a single field to a subfield, "alias this"-style?
Sep 06, 2011
Vladimir Panteleev
Sep 06, 2011
Timon Gehr
Sep 06, 2011
Jonathan M Davis
Sep 07, 2011
Vladimir Panteleev
September 06, 2011
What I'm trying to do:

struct S1 { int f; }
struct S2
{
	S1 s1;
	alias s1.f g;
}

This doesn't work. The declaration compiles, but attempts to access g result in:

Error: struct test.S2 'f' is not a member
Error: struct test.S2 member f is not accessible
Error: this for f needs to be type S1 not type S2

I could generate @properties with mixins, but that breaks DDoc. Is there a neater solution?

-- 
Best regards,
 Vladimir                            mailto:vladimir@thecybershadow.net
September 06, 2011
On 09/06/2011 11:03 PM, Vladimir Panteleev wrote:
> What I'm trying to do:
>
> struct S1 { int f; }
> struct S2
> {
> S1 s1;
> alias s1.f g;
> }
>
> This doesn't work. The declaration compiles, but attempts to access g
> result in:
>
> Error: struct test.S2 'f' is not a member
> Error: struct test.S2 member f is not accessible
> Error: this for f needs to be type S1 not type S2

Yes, that is because alias does not work with expressions, only with symbols.

>
> I could generate @properties with mixins, but that breaks DDoc. Is there
> a neater solution?
>

You mean like this?

struct S1 { int f; }
struct S2 {
    S1 s1;
    @property int g(){return s1.f;}
    @property void g(int x){s1.f=x;}
}

You may be able to remove the effect on Ddoc by using a version(StdDdoc) condition or similar.


September 06, 2011
On Wednesday, September 07, 2011 00:02:49 Timon Gehr wrote:
> On 09/06/2011 11:03 PM, Vladimir Panteleev wrote:
> > What I'm trying to do:
> > 
> > struct S1 { int f; }
> > struct S2
> > {
> > S1 s1;
> > alias s1.f g;
> > }
> > 
> > This doesn't work. The declaration compiles, but attempts to access g result in:
> > 
> > Error: struct test.S2 'f' is not a member
> > Error: struct test.S2 member f is not accessible
> > Error: this for f needs to be type S1 not type S2
> 
> Yes, that is because alias does not work with expressions, only with symbols.
> 
> > I could generate @properties with mixins, but that breaks DDoc. Is there a neater solution?
> 
> You mean like this?
> 
> struct S1 { int f; }
> struct S2 {
>      S1 s1;
>      @property int g(){return s1.f;}
>      @property void g(int x){s1.f=x;}
> }
> 
> You may be able to remove the effect on Ddoc by using a version(StdDdoc)
> condition or similar.

The version that is affected by -D is version(D_Ddoc). Phobos uses version(StdDdoc) so that programmers can choose to set up their projects so that they can be compiled with -D and still work rather than just generate documentation (which pretty much only works if version(D_Ddoc) is never used). But it has to do stuff with its makefiles to make that work. So, you can always use your own version for it, but you'd have to set up your makefiles so that they use it with -version on your documentation builds.

- Jonathan M Davis
September 07, 2011
On Wed, 07 Sep 2011 01:02:49 +0300, Timon Gehr <timon.gehr@gmx.ch> wrote:

> Yes, that is because alias does not work with expressions, only with symbols.

Thanks. Seems odd that you can forward *all* undefined symbols to a sub-class/struct, but not just specific ones. I wonder how hard would it be to get that "alias" syntax working in the same manner.

-- 
Best regards,
 Vladimir                            mailto:vladimir@thecybershadow.net