Inline aggregate types

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Fri Dec 2 02:16:17 PST 2016


On 2016-12-02 10:11, Ethan Watson wrote:
> On Friday, 2 December 2016 at 08:33:17 UTC, Jacob Carlborg wrote:
>> But wWhat about an anonymous class as ag0aep6g mentioned?
>
> Usability I see is something that is key here. Having to do a typeof
> yourself is one extra step away from an intuitive API.
>
> So I tried making a definition like this:
>
> mixin template BitPack( Descriptor instance, string NameAlias =
> Descriptor.stringof )
> {
>   mixin( GenerateBitPackBody!( Descriptor, Descriptor.stringof )() );
> }
>
> ...but I can't work out how to make the template evaluator treat
> descriptor as a templated type without explicitly defining that type as
> the first parameter.
>
> Even trying:
>
> mixin template BitPack( alias Descriptor ) if( is( typeof( Descriptor ) ) )
>
> or:
>
> mixin template BitPack( alias Descriptor ) if( __traits( compiles,
> &Descriptor ) )
>
> wasn't getting me valid code (in the case of the latter, it claims it's
> not a valid template value argument; in the former, it meant I would
> have needed to add additional constraints to the other BitPack template).
>
> I bet there's a trick out there that'll let me do what I want. But I
> won't go looking for it at least.

Using an alias without a template constraint works for me. No "typeof" 
is required when using the template:

template Foo(alias T)
{
     pragma(msg, __traits(identifier, T.tupleof[0]));
}

struct PackSize
{
     int size;
}

void main()
{
     mixin Foo!(
         new class {
             @PackSize( 3 ) int iSomeInt = 3;
             @PackSize( 1 ) bool bSomeBool = true;
             @PackSize( 4 ) int iSomeOtherInt;
         }
     );
}

The only difference now from your original example is "new class" 
instead of "struct".

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list