virtual method pointer

Gor Gyolchanyan gor.f.gyolchanyan at gmail.com
Fri May 4 02:51:38 PDT 2012


Does this have an overhead over calling virtual method directly?

On Fri, May 4, 2012 at 1:30 PM, jerro <a at 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.


More information about the Digitalmars-d mailing list