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