Calling a member function pointer in a template with implicit this

120 Views Asked by At

Looking at this answer I can see how to call a pointer to a member function by explicitly passing in this. However, what if I want the function passed in to be a member of the current object and to use the implicit this.

I've written this, which seems to work, but is it valid code, and is there a better way (C++14 or below) avoiding the dynamic_cast<>? Source on onlinegdb.com

#include <iostream>

class Base
{
    public:
        // From https://stackoverflow.com/a/9779391/1270789
        template<typename T, typename R>
        R proxycall(T *obj, R (T::*mf)(int))
        {
            return (obj->*mf)(42);
        }

        // My attempt
        template<typename T, typename R>
        R proxycall(R (T::*mf)(int))
        {
            return ((dynamic_cast<T *>(this))->*mf)(42);
        }
        
        virtual ~Base() {}
};

class Foo: public Base
{
    public:
        int doFoo(int x) { std::cout << "doing foo\n"; return x / 2; }
        int doCall() { return proxycall(this, &Foo::doFoo); } // OK
        int doNoThisCall() { return proxycall(&Foo::doFoo); } // Is this OK?
};

int main()
{
    Foo foo;
    std::cout << foo.doCall() << '\n';
    std::cout << foo.doNoThisCall() << '\n';

    return 0;
}
0

There are 0 best solutions below