C++: Pointer to monomorphic version of virtual member function?

前端 未结 3 1939
悲&欢浪女
悲&欢浪女 2020-12-05 02:55

In C++, it\'s possible to get a pointer to a (non-static) member function of a class, and then later invoke it on an object. If the function was virtual, the call is dispatc

相关标签:
3条回答
  • 2020-12-05 03:04

    To elaborate with a code example for a wrapper function (and despite the fact the OP wanted to avoid this method!) as in many cases this is the pragmatically preferable solution:

    #include <iostream>
    using std::cout; using std::endl;
    
    struct Foo
    {
        virtual void foo() { cout << 1 << endl; }
    };
    
    struct Foo2: public Foo
    {
        virtual void foo() { cout << 2 << endl; }
    };
    
    void monomorphicFooFoo( Foo * f ) { f->Foo::foo(); }
    
    int main()
    {
        Foo *foo = new Foo2;
    
        void (*baseFoo)( Foo * ) = &monomorphicFooFoo;
        baseFoo( foo ); // Prints 1
    }
    
    0 讨论(0)
  • 2020-12-05 03:05

    In other words : you want to cheat.

    No, it is not possible because that is how the polymorphism in combination with pointer to member method works.

    0 讨论(0)
  • 2020-12-05 03:07

    It's possible in GCC, but the way it's documented in C++ language extensions section suggests there's no portable way to do it.

    You can do two things:

    1. If you control the class, create a non-virtual function and a virtual wrapper for it and when you know you don't need virtual dispatch, just take address of the non-virtual one.
    2. If you don't, create a template functor that will hold the member pointer and do the explicit scope call.
    0 讨论(0)
提交回复
热议问题