specializing template with string variable in CTFE

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Oct 26 05:29:20 PDT 2014


On Sunday, 26 October 2014 at 12:27:55 UTC, Marc Schütz wrote:
> On Sunday, 26 October 2014 at 10:48:46 UTC, ketmar via 
> Digitalmars-d-learn wrote:
>> Hello.
>>
>> the following code is not working:
>>
>>  template prstr(string s) {
>>    enum prstr = "write("~s.stringof~");\n";
>>  }
>>
>>  string buildWriter() (string fmt) {
>>    return prstr!(fmt[0..$-1]);
>>  }
>
> Your passing the runtime parameter `fmt` as template argument. 
> Try this:
>
>     string buildWriter(string fmt)() {
>       return prstr!(fmt[0..$-1]);
>     }
>
>>
>>  string writer(string fmt) () {
>>    enum s = buildWriter(fmt);
>
> and this:
>       enum s = buildWriter!(fmt);
>
>>    return s;
>>  }
>>
>>  void main () {
>>    import std.stdio;
>>    writeln(writer!"str"());
>>  }
>>
>>  z40.d(6): Error: variable fmt cannot be read at compile time
>>  z40.d(10): Error: template instance z40.buildWriter!() error 
>> instantiating
>>  z40.d(16):        instantiated from here: writer!"str"
>>
>> but why? fmt is known in CTFE and compiler can use it as 
>> string literal
>> for instantiating `prstr`.
>>
>> please, don't mind the idiocity of the code: this is just a 
>> sample to
>> show what confuses me. i know about possibility of moving 
>> `fmt` to
>> template argument, but i need it as function argument, 'cause
>> `buildWriter()` actually does string processing and i want to
>> instantiate `prstr` with the part of the string. and this 
>> processing
>> cannot be done in 'foreach'.
>>
>> and writing everything in functional style sux: it leads to 
>> explosive
>> growing of the number of arguments passed to templates.

Sorry, didn't read the rest of your post before replying :-P


More information about the Digitalmars-d-learn mailing list