Compile-time variables
Kayomn
spam at kayomn.net
Fri Apr 6 00:35:39 UTC 2018
On Friday, 6 April 2018 at 00:21:54 UTC, H. S. Teoh wrote:
> On Thu, Apr 05, 2018 at 11:53:00PM +0000, Kayomn via
> Digitalmars-d-learn wrote: [...]
>> [...]
> [...]
>> [...]
>
> `lastID`, as declared above, are runtime variables. The
> 'static' in this case just means it's thread-local, rather than
> allocated on the stack. You cannot modify these variables at
> compile-time.
>
>
>> [...]
>
> You appear to be wanting to increment a global variable during
> compile-time. Unfortunately, there is no such thing as a
> compile-time global variable. You will have to find some other
> way to implement what you want.
>
> One way to do this would be to use compile-time introspection
> to construct a list of nodes, and then use a CTFE function or
> static foreach to generate node IDs all at once. For example:
>
> string generateEnum(T...)()
> {
> if (__ctfe) { // only run at compile-time
> string code = "enum NodeIds {";
> foreach (ident; T) {
> code ~= ident ~ ", ";
> }
> code ~= "}";
> return code;
> }
> else assert(0);
> }
>
> alias MyNodes = List!(
> // Just an example; you probably want to generate this
> // list via introspection, e.g. via __traits(getMembers)
> // or something like that.
> identifier1,
> identifier2,
> ...
> );
>
> mixin(generateEnum!MyNodes); // defines `enum NodeIds`
>
> static assert(NodeIds.identifier1 == 0);
> static assert(NodeIds.identifier2 == 1);
> ...
>
> There are probably other ways to do it too, but I chose enum
> because it naturally assigns incrementing IDs to its members,
> so it's a convenient construct for this purpose.
>
>
> T
I think I didn't explain well enough, I'm not trying to generate
an enum from a list of pre-defined known quantities. The idea is
that a compile-time generic function exists and it generates a
unique identifier for that node.
My reasons for doing this is to remove the need to keep a master
enum that holds an identifying value for each node. I've
implemented this same thing in C++ before and it was extremely
straightforward.
More information about the Digitalmars-d-learn
mailing list