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;
}