Does this have an overhead over calling virtual method directly? On Fri, May 4, 2012 at 1:30 PM, jerro <a...@a.com> wrote: > On Thursday, 3 May 2012 at 18:47:11 UTC, Gor Gyolchanyan wrote: >> >> I need to get a pointer to a virtual method, which is in turn a >> function pointer, being set by virtual method binding. >> Can anyone, please, tell me how to get it? Taking the delegate of the >> method won't do, because I need it to behave exactly as a virtual >> method call, except I pass the "this" explicitly. >> I need this in an event handling mechanism I'm making. You derive from >> the Sink class, passing your static type to the constructor, which >> scans your virtual methods, that conform to specific requirements and >> extracts them into an array, which later uses to dispatch the incoming >> events. >> It will feel much like a run-time virtual template method. > > > If I understand you correctly, you could use something like this > > template methodToFunction(A, string method) > { > auto methodToFunction(A a, ParameterTypeTuple!(mixin("A." ~ method)) p) > { > return mixin("&a." ~ method)(p); > } > } > > If you use it like this: > > class Foo > { > int m; > > void bar(int a, string b) > { > writefln("%s\t%s\t%s", m, a, b); > } > } > > class Child: Foo > { > void bar(int a, string b) > { > writeln("child"); > } > } > > void main() > { > auto foo = new Foo; > foo.m = 1; > auto child = new Child; > auto bar = &methodToFunction!(Foo, "bar"); > bar(foo, 2, "3"); > bar(child, 2, "3"); > } > > It prints: > > 1 2 3 > child > > It won't work correctly with overloading, though. It could > be made to work with overloading, but then you would > have to pass all the parameter types of the method to > the methodToFunction template.
-- Bye, Gor Gyolchanyan.