Template question

Reiner Pope reiner.pope at REMOVE.THIS.gmail.com
Wed Oct 4 19:20:12 PDT 2006


Chad J > wrote:
> I'm trying to write a template that, when instantiated, gives a value 
> that is the same as the last time it was instantiated plus one.  Here is 
> some code I tried, but it doesn't work:
The reason this sort of thing is not supported with templates is that it 
creates ambiguities. Template evaluation is lazy, meaning (a) it is only 
done when it is required, and (b) it can be done in any order. This is 
really the obvious way to do it.

For example, consider the following code:

void foo()
{
   writefln( GetUID!() );
}

void bar()
{
   writefln( GetUID!() );
}

void main()
{
   bar();
   foo();
}

Which one prints 1, and which one prints 2? I can think of two arbitrary 
rules which resolve the ambiguity:
1. evaluate all templates from the top of the source code down; or
2. evaluate all templates according to execution order.

The problem is that 1. is arbitrary and contradicts the assumption and 
aim the rearranging the order of functions won't change anything, and 2. 
is not always decidable, vis a vis the halting problem.


I don't actually have an idea of what you are trying to accomplish, 
though. If just simple accumulator, then write it as actual D code and 
let the optimizer inline and pre-evaluate it without your assistance. If 
you want something else, I'm sure there is a way to do it within the 
template system -- you'll probably find Thomas and BCS's suggestions the 
right sort of thing.

Cheers,

Reiner



More information about the Digitalmars-d-learn mailing list