Templates with strings

Mike Linford mike.linford.reg at gmail.com
Sat Jul 3 23:33:40 PDT 2010


On Sun, 04 Jul 2010 00:43:50 +0000, BCS wrote:

> Hello Mike,
> 
>> I'm trying to compile the following file. Can somebody explain to me
>> how I can rewrite it so that I don't get "Error: non-constant
>> expression"? All I'm trying to do is create, using templates, a string
>> of all characters between two given characters:
>> 
>> 
> 1) where did you get that error? (I'm lazy, sorry) 2) is there a reason
> you don't use CTFE?
> 
> dchar[] Between(dchar start, dchar stop) {
>   if(start > stop) { auto t = start; start = stop; stop = t; }
> 
>   dchar[] ret;
>   for(dchar d = start; d<=stop; d++) ret ~= d; return ret;
> }
> 
> import std.stdio;
> void Go(dchar[] s)(){writef("%s\n", s); } void
> main(){Go!(Between('a','g'))();}
> 
>> 1 module ua;
>> 2
>> 3 template dcharInterval(immutable(dchar) start, immutable(dchar) stop)
>> 4 {
>> 5    static assert(stop >= start);
>> 6    static if(start == stop)
>> 7       dstring dcharInterval = [start]; 8    else
>> 9       dstring dcharInterval = [start] ~ dcharInterval!(start + 1,
>> stop);
>> 10 }
>> 11
>> 12 dstring LATIN = "\u00AA"d ~ "\u00BA"d ~ dcharInterval!(0x00C0,
>> 0x00D6);
>> 13
>> Thanks.
>>

Hi BCS,

1. I was getting that error on lines 9 and 12. I got it a couple dozen 
times (I assume once for each template instance).

2. The reason I don't use CTFE is because I don't know how to be certain 
its been called at compile time. Apparently using a result in a template 
like you did will accomplish that, but is there a way I can be sure 
without making up bogus empty templates?

Thanks.

-- 
Mike Linford


More information about the Digitalmars-d-learn mailing list