The Final(ize) Challenge

Guillaume B. guillaume.b.spam at spam.ca
Fri May 22 20:39:16 PDT 2009


Andrei Alexandrescu wrote:
> 
> For starters, I'd like to present you with the following challenge.
> Given any class C, e.g.:
> 
> class C
> {
>      void foo(int) { ... }
>      int bar(string) { ... }
> }
> 
> define a template class Finalize(T) such that Finalize!(C) is the same
> as the following hand-written class:
> 
> final class FinalizeC : C
> {
>      final void foo(int a) { return super.foo(a); }
>      final int bar(string a) { return super.bar(a); }
> }
> 
> Finalize is cool when you need some functionality from an exact class
> and you don't want to pay indirect calls throughout. All calls through
> Finalize!(C)'s methods will resolve to static calls.
> 

 Hi,

 I don't fully understand the uses of Finalize!(C)... But for logging (or
timing), this kind of template could be useful... it think!... Anyway,
something like this:

class MagicLog(T) : T
{
// D Magic...
}

Could turn a class like this:

class C
{
   int foo() { ... }
}

to this:

class MagicLogC
{
   int foo() {
      Log.write("Entering foo()");
      scope(success) Log.write("Leaving foo(): success");
      scope(failure) Log.write("Leaving foo(): failure");
      return super.foo();
   }
}

And then, somewhere else:

version(WithMagicLog) {
   C c = new MagicLog!(C); // With logging
} else {
   C c = new C; // Full speed, no logging
}
int i = c.foo();

 Seems pretty useful to me! :) The only problem is writing the MagicLog
class.

 Guillaume B.





More information about the Digitalmars-d mailing list