Getting the initial value of a class field in compile time.

Steven Schveighoffer schveiguy at gmail.com
Sun Feb 9 02:25:56 UTC 2020


On 2/8/20 7:39 PM, realhet wrote:
> On Sunday, 9 February 2020 at 00:15:47 UTC, Drug wrote:
>> On Saturday, 8 February 2020 at 23:37:56 UTC, realhet wrote:
>>> Hello,
>>>
>>> class A{
>>>   int i = 42;
>>> }
>>>
>>> Is there a way to get that 42? (Input is the class A and the name of 
>>> the field 'i')
>>>
>>> A.i.init returns 0, so it doesn't care about the class.
>>>
>>> classinfo.m_init can be an option, but maybe there's a nicer way to 
>>> do this?
>>>
>>> Thx!
>>
>> Try A.init.i
> 
> I tried and A.init.stringof == "void()"
> 
> That generates a new question, what is void() ?
> It has no sizeof property.
> I guess it's the voidest of the voids in D :D

Looks like you wrote a function void init() inside your class.

Don't do that. D has a default init property.

But as an aside, A.init has a value of null. So A.init.i => segfault.

The 42 lives inside the intializer, which is a void array stored in the 
TypeInfo. But you probably don't want to get it that way.

Adam's way is technically a good way to get it. But you don't 
necessarily need that (and it might not be what you are looking for -- 
the constructor could easily change i to a different value). Problem is 
that typeid cannot be read at compile time. 
https://issues.dlang.org/show_bug.cgi?id=7147

If you could do that, you could construct a "pre-constructed" class 
instance, and use it as the prototype for reading the int value.

-Steve


More information about the Digitalmars-d-learn mailing list