Thread overview
How to get value of type at CT given only an alias
Jul 14, 2017
FoxyBrown
Jul 14, 2017
Moritz Maxeiner
July 14, 2017
Trying to do some tricky stuff but I can't seem to get the value of a type(enum in my case, but must work in general).

Basically, given a type T or an alias T(alias preferred), I'd like to be able to get the "default value" of that type.

e.g.,

if it is an enum and I have an alias to a member, instead of (Enum)3 I want 3.

if it is a member field, I want the default value.

if it is a function pointer, the address(probably 0, but whatever).

Basically a sort of generic "getValue" that attempts to get the CT value of any type, if it exists. (obviously the value of class is meaningless, so returns ""... class isn't even a type, but can still query).

In fact, I'd like to also naturally resolve the value back in to the expression that created it.

e.g.,

(Enum)3 -> Enum.ThirdEntry


July 14, 2017
On 7/14/17 1:51 PM, FoxyBrown wrote:
> Trying to do some tricky stuff but I can't seem to get the value of a type(enum in my case, but must work in general).
> 
> Basically, given a type T or an alias T(alias preferred), I'd like to be able to get the "default value" of that type.
> 
> e.g.,
> 
> if it is an enum and I have an alias to a member, instead of (Enum)3 I want 3.
> 
> if it is a member field, I want the default value.
> 
> if it is a function pointer, the address(probably 0, but whatever).
> 
> Basically a sort of generic "getValue" that attempts to get the CT value of any type, if it exists. (obviously the value of class is meaningless, so returns ""... class isn't even a type, but can still query).
> 
> In fact, I'd like to also naturally resolve the value back in to the expression that created it.
> 
> e.g.,
> 
> (Enum)3 -> Enum.ThirdEntry
> 
> 

.init is the default value.

I'm not sure you can get the default value of a non-default initializer, My attempts using init didn't work. e.g.:

void foo(alias T)()
{
   pragma(msg, T.init);
}

struct S
{
   int y = 5;
   void bar() { foo!y; } // prints 0
}

-Steve
July 14, 2017
On Friday, 14 July 2017 at 18:06:49 UTC, Steven Schveighoffer wrote:
>
> .init is the default value.
>
> I'm not sure you can get the default value of a non-default initializer, My attempts using init didn't work. e.g.:
>
> void foo(alias T)()
> {
>    pragma(msg, T.init);
> }
>
> struct S
> {
>    int y = 5;
>    void bar() { foo!y; } // prints 0
> }

See spec [1]:

"If applied to a variable or field, it is the default initializer for that variable or field's type."

If you want to get at the 5 in a static context, you'd have to use

---
S.init.y
---

i.e. get the default initializer for the struct and get its y member's value.

[1] https://dlang.org/spec/property.html#init