Feature idea: .userinit property (or trait) to retrieve the initializer of a variable
Maxim Fomin
maxim at maxim-fomin.ru
Wed Jul 17 04:47:07 PDT 2013
On Wednesday, 17 July 2013 at 11:28:18 UTC, Andrej Mitrovic wrote:
> I often need to re-initialize a variable back to its
> user-defined
> initializer. For variables that have no user-defined
> initializer, you
> can simply use .init. For fields of structs or classes you can
> actually use A.init.field, where A is the aggregate type. For
> example:
>
> -----
> struct S
> {
> int value = 5;
> }
>
> void main()
> {
> S s;
> s.value += 1;
> s.value = S.init.value;
> assert(s.value == 5); // ok
> }
> -----
>
> But there's no equivalent for variables which do not belong to
> any aggregate:
>
> -----
> void main()
> {
> int value = 5;
> value += 1;
> // value = ??
> assert(value == 5);
> }
> -----
I think this is not a fair comparison. Your S s could be S s =
S(2) and you cannot retrieve S(2) just like in case with int
value = 5. I see no difference between basic type variables and
user-defined variables here.
Also, this reminds me replacing typedef by alias with loosing one
nice feature - you could do typedef MyInt int = 5; but not with
alias.
> One workaround is to factor out the initializer to a manifest
> constant, for example:
Other approach is to use UDA, it may be better then enum, but one
still need extra typing. Having new trait seems to be a good idea
but it needs to be figured out how it behaves in different
contexts.
More information about the Digitalmars-d
mailing list