Thread overview | |||||
---|---|---|---|---|---|
|
April 17, 2013 Use enum base type? | ||||
---|---|---|---|---|
| ||||
Is it possible to evaluate an enum's base type? Ideally something like: enum somestrs : string { ... } enum d = 0.0; template EnumBaseType(E) if (is(E==enum)) { ... } unittest { static assert( is(EnumBaseType!somestrs == string) ); static assert( is(EnumBaseType!d : float) ); static assert(!is(EnumBaseType!d == float) ); } A template like this would make at least my life easier. |
April 17, 2013 Re: Use enum base type? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Janissary | On 2013-04-17, 19:15, Janissary wrote: > Is it possible to evaluate an enum's base type? Ideally something like: > > enum somestrs : string { ... } > enum d = 0.0; > template EnumBaseType(E) if (is(E==enum)) { ... } > unittest { > static assert( is(EnumBaseType!somestrs == string) ); > static assert( is(EnumBaseType!d : float) ); > static assert(!is(EnumBaseType!d == float) ); > } > > A template like this would make at least my life easier. Whenever you want to do weird stuff with types, std.traits[1] should be your #1 stop. And quite correctly, std.traits.OriginalType[2] does what you want: enum E : int { a } typedef E F; typedef const F G; static assert(is(OriginalType!G == const int)); [1]: http://dlang.org/phobos/std_traits [2]: http://dlang.org/phobos/std_traits#.OriginalType -- Simen |
April 17, 2013 Re: Use enum base type? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Simen Kjaeraas | On Wednesday, 17 April 2013 at 18:56:43 UTC, Simen Kjaeraas wrote:
> On 2013-04-17, 19:15, Janissary wrote:
>
>> Is it possible to evaluate an enum's base type? Ideally something like:
>>
>> enum somestrs : string { ... }
>> enum d = 0.0;
>> template EnumBaseType(E) if (is(E==enum)) { ... }
>> unittest {
>> static assert( is(EnumBaseType!somestrs == string) );
>> static assert( is(EnumBaseType!d : float) );
>> static assert(!is(EnumBaseType!d == float) );
>> }
>>
>> A template like this would make at least my life easier.
>
> Whenever you want to do weird stuff with types, std.traits[1] should
> be your #1 stop. And quite correctly, std.traits.OriginalType[2] does
> what you want:
>
> enum E : int { a }
> typedef E F;
> typedef const F G;
> static assert(is(OriginalType!G == const int));
>
> [1]: http://dlang.org/phobos/std_traits
> [2]: http://dlang.org/phobos/std_traits#.OriginalType
Thanks, that's just what I needed.
|
Copyright © 1999-2021 by the D Language Foundation