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