Указатель на функцию-член, передать функцию как аргумент функции, не являющейся членом

Можно ли сделать что-то подобное? Без использования статических функций или сделать chordL член power, Я действительно не понимаю, как это сделать, неужели это невозможно?

class power {
double b;

public:
void set(double par){b=par}

double fun(double arg){
return b*pow(arg,2);
}

double execute(double par1, double par2);
};

double chordL(power::*fm, double p1, double p2){      // it's not a member function
return sqrt(pow(fm(p1)-fm(p2),2)+pow(p1-p2,2));  // clearly doesn't work!
}

double power::execute(double par1, double par2){     // it's a member function
double (power::*g)(double);
g=&power::fun;
return chordL(g,par1,par2);
}

0

Решение

Вы не можете сделать это. Функция-член (которая не объявлена static) имеет специальный / скрытый аргумент this, Если у вас есть объект правильного типа, вы можете передать его вместе с функцией и вызвать его, используя неясный синтаксис, необходимый для вызовов функций-членов:

 double chordL(power* tp, double (power::*fm)(double), double p1, double p2)
...
(tp->*fm)(p1);double power::execute(double par1, double par2){     // it's a member function
double (power::*g)(double);
g=&power::fun;
return chordL(this, g,par1,par2);
}

Редактировать: добавлен код вызова, передача this к функции chordL, и поменял местами порядок объекта и указатель функции из предыдущего поста — имеет смысл передать this в качестве первого аргумента. И я исправил аргумент указателя на функцию.

3

Другие решения

Вам нужен экземпляр power чтобы вызвать указатель на функцию следующим образом:

double chordL(T& instance, T::*fm, double p1, double p2){
return sqrt(pow(instance.*fm(p1) - instance.*fm(p2), 2) + pow(p1 - p2, 2));
}
0

При вызове функции-члена вам нужно указать объект, к которому она должна быть вызвана. Вам нужно пройти this указатель на chordL а также, и вызвать функцию, как это:

template<class T>
double chordL(T* t, double (T::*fn)(double), double p1, double p2)
{
return sqrt(pow((t->*fn)(p1) - (t->*fn)(p2), 2) + pow(p1 - p2, 2));
}
0
По вопросам рекламы [email protected]