Question about Template
Michael
pongad at gmail.com
Wed Jun 27 01:58:02 PDT 2012
Thank you all of you for your help!
Michael
On Sunday, 24 June 2012 at 06:49:38 UTC, Philippe Sigaud wrote:
>> The closest I came to the correct template is
>> template(alias F) timer {
>> auto timer {
>> auto start = Clock.currStdTime();
>> F();
>> return Clock.currStdTime() - time;
>> }
>> }
>
>> The problem with the template is I cannot pass any argument
>> into "F". How
> should I fix this problem?
>
> As Simendsjo said, you can use a function template to get what
> you want and
> a nicer syntax as the same time.
>
> Slightly different code can be obtained by starting from the
> above code:
>
> template timer(alias F) // capture F's name
> {
> auto timer(Args...)(Args args) // there are your parameters
> {
> import std.datetime; // inner imports
> auto start = Clock.currStdTime();
> F(args);
> return Clock.currStdTime() - start;
> }
> }
>
> So it's a template that gets expanded into another template
> with the same
> name, a function.
>
> Note that the construct:
>
> template (T...)
> {
> T foo(T t) // some function that depends on the template
> parameters
> {
> }
> }
>
> can get syntax sugar like this:
>
> T foo(T...)(T t)
> {
> }
>
> you can 'fuse' the external template and the inner code to get
> a function
> template. The same for classes and structs.
>
> Now, for something a bit more hairy: Simendsjo's version and
> mine are not
> strictly equivalent:
>
> - his version is simpler to type and to reason about. You
> should use it,
> it's the D way to do this kind of thing.
> - mine (the two level templates) gets an interesting effect: I
> can use the
> first level only (getting the function name), keeping the
> second level for
> later:
>
> // mine
> alias timer!foo tfoo; // tfoo is the inner template, the
> function template
> /* a bit later */
> tfoo(args1);
> tfoo(args2);
>
> import std.algorithm;
> Args[] argsArray;
> auto m = map!(tfoo)(argsArray); // applying tfoo on all
> arguments groups
>
> // Simendsjo:
> timer!foo(args1);
> timer!foo(args2); // You must provide 'foo' for each call.
>
>
>>
>> Also, I am not entirely sure why I need to write "alias F"
>> instead of
> just "F", any explanation would be appreciated.
>
> Because in your case, you want to get the name, the symbol. So
> use an alias
> parameter. 'F' would be to deal with types, as Ali said.
>
> For example:
>
> auto foo(F, Args...)(F fn, Args args)
> {
> ...
> }
>
> in this case, fn is passed as a runtime value of type F:
>
> timer(&foo, args); // the compiler automatically deduces the
> types of fn
> and args.
>
> Philippe
More information about the Digitalmars-d
mailing list