Figure 1: Possible solutions to problem of passing a member function as a parameter

class heat
    {
public:
    float sr(float);
    static float sr1(float);
    //
    //  #1
    static float func1(float k)
        {
        return (k + sr1(3.0));
        }
    //
    //  #2
    float func(float k)
        {
        return (k + sr(3.0));
        }
    //
    //  #3
    float 
    func(float (*fx)(float), float k)
        {
        return (k + fx(3.0));
        }
    //
    //  #4
    float 
    func(float (heat::*fx)(float), float k)
        {
        return (k + ((*this).*fx)(3.0));
        }
    //
    //  #5
    float 
    func(heat &that, float
        (heat::*fx)(float), 
        float k)
        {
        return (k + (that.*fx)(3.0));
        }
    };
     
int main()
    {
    heat obj;
    heat::func1(5.1);              // #1 
    obj.func(5.1);                 // #2 
    obj.func(heat::sr1, 5.1);      // #3 
    obj.func(&heat::sr, 5.1);      // #4 
    obj.func(obj, &heat::sr, 5.1); // #5 
    }