Going from CTFE-land to Template-land

Don nospam at nospam.com
Tue Nov 17 07:07:03 PST 2009


Bill Baxter wrote:
> Currently this doesn't work, because the CTFE function doesn't "know"
> that it's running compile-time:
> 
> int templ_incr(int x)() {
>     return x+1;
> }
> 
> int ctfe_incr(int x) {
>     return templ_incr!(x);
> }
> 
> Seems common to write a function that you know is only intended to be
> used compile-time.
> But it can't compile because the compiler doesn't know you only plan
> to call it at compile-time.
> 
> Is something version(__ctfe) might help with?  E.g.
> version(__ctfe) {
>     // only allow cfte_incr to be called at compile-time so it can use templates
>     int ctfe_incr(int x) {
>         return templ_incr!(x);
>     }
> }

No. Here's the only functionality you'll get. This works by exploiting 
bug 1330. It's inefficient: the inCTFE function gets called all the 
time. Should just be a bool value, which will be constant-folded away. 
Otherwise, it's the same as this:

// true if evaluated in CTFE, false if called at runtime.
bool inCTFE()
{
      int [1] x = [1];
      int [] y = x;
      y[0] = 2;
      return x[0]!=2;
}

static assert(inCTFE());

void main()
{
   assert(!inCTFE());
}



More information about the Digitalmars-d mailing list