digitalmars.D.learn - How to get value of type at CT given only an alias
- FoxyBrown (18/18) Jul 14 2017 Trying to do some tricky stuff but I can't seem to get the value
- Steven Schveighoffer (14/41) Jul 14 2017 .init is the default value.
- Moritz Maxeiner (12/24) Jul 14 2017 See spec [1]:
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
Jul 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
Jul 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
Jul 14 2017








Moritz Maxeiner <moritz ucworks.org>