template deduction

Mafi mafi at example.org
Mon Aug 23 04:48:56 PDT 2010


Am 22.08.2010 21:45, schrieb bearophile:
(...)
> import std.stdio: writeln;
> import std.typecons: Tuple, tuple;
> import std.traits: ReturnType, ParameterTypeTuple;
>
> struct Memoize(alias F) {
>      ReturnType!F opCall(ParameterTypeTuple!F args) {
>          alias ReturnType!F ResultType;
>          static ResultType[Tuple!(ParameterTypeTuple!F)] cache;
>          auto ptr = tuple(args) in cache;
>          if (ptr == null) {
>              auto result = F(args);
>              cache[tuple(args)] = result;
>              return result;
>          } else {
>              return *ptr;
>          }
>      }
> }
>
> pure int fib(int n) {
>      if (n<  2)
>          return n;
>      return fib(n - 1) + fib(n - 2);
> }
>
> void main() {
>      pure int delegate(int n) cfib_impl;
>      Memoize!cfib_impl cfib;
>
>      cfib_impl = (int n) {
>          if (n<  2)
>              return n;
>          return cfib(n - 1) + cfib(n - 2);
>      };
>
>      enum int N = 40;
>      writeln("fib(", N, ") = ", fib(N));
>      writeln("cfib(", N, ") = ", cfib(N));
> }
>
> Bye,
> bearophile
I see; I should use template magic. Oh, and I used Tuple the wrong way 
beacuse I've never used it before.
Thanks

Mafi


More information about the Digitalmars-d-learn mailing list