Search code examples
c++classpointersfunction-pointersiunknown

C++ Pointer to member function of an UNKNOWN CLASS


DISCLAIMER I DO NOT USE BOOST OR OTHER LIBRARIES

Finally I've learned how PointerToMemberFunction works. This is my example code.

#include <iostream>

using namespace std;

class Foo
{
        public:
                void foo ( )
                {
                        cout << "I'm a foo method\n";
                };
};

class Bar
{
        public:
                void bar ( Foo* fooPtr , void(Foo::*fooFnPtr)() )
                {
                        (fooPtr->*fooFnPtr)();
                };
};

int main()
{
        Foo* foo = new Foo();
        Bar* bar = new Bar();

        bar->bar ( foo , &Foo::foo );

        return 0;
}

Now, what the problem is. Bar::bar must be modified somehow, because in real project it won't know, what class fooFnPtr is a pointer to. In other words Bar::bar must work with any class, not only with Foo. I won't know, a pointer to an instance of what class is passed to Bar::bar.

The one thing which can help is that all classes which will work with Bar::bar are children of one class!

Is this achievable and how? How do i fix my code? Thanks in advance!


Solution

  • You could make bar a template function:

    template<class T>
    void bar ( T* fooPtr , void(T::*fooFnPtr)() )
    {
        (fooPtr->*fooFnPtr)();
    }
    

    Of course, if you only want to pass pointers to members that exist in the common base class, you can simply do this:

    #include <iostream>
    
    using namespace std;
    
    class Foo
    {
            public:
                    virtual void foo ( )
                    {
                            cout << "I'm a foo method\n";
                    };
    };
    
    class Derived: public Foo
    {
            public:
                    virtual void foo ( )
                    {
                            cout << "I'm a Derived method\n";
                    };
    };
    
    
    class Bar
    {
            public:
                    void bar ( Foo* fooPtr , void(Foo::*fooFnPtr)() )
                    {
                            (fooPtr->*fooFnPtr)();
                    }
    };
    
    int main()
    {
            Derived* derived = new Derived();
            Bar* bar = new Bar();
    
            bar->bar ( derived , &Foo::foo );
    
            return 0;
    }