The Final(ize) Challenge
Denis Koroskin
2korden at gmail.com
Mon May 18 14:02:14 PDT 2009
On Mon, 18 May 2009 20:12:40 +0400, Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> wrote:
> Ok, now with the advent (or rediscovery) of allMembers which I had no
> idea existed, we're ready to start some serious butt-kick reflection
> facilities.
>
> 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.
>
>
> Have at it!
>
> Andrei
template Finalize(T)
{
final class Finalize : T
{
this(Args...)(Args args)
{
super(args);
}
}
}
The following code /should/ work as you ask. There is no need to iterate over all the methods and make a final version out of it for two reasons
1) It is redundant
2) It creates an additional overhead
unless that's was you *really* need.
Future work: Finalize!(T) should resolve to T iff T is already final.
More information about the Digitalmars-d
mailing list