Можно ли сделать что-то подобное? Без использования статических функций или сделать 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);
}
Вы не можете сделать это. Функция-член (которая не объявлена 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
в качестве первого аргумента. И я исправил аргумент указателя на функцию.
Вам нужен экземпляр 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));
}
При вызове функции-члена вам нужно указать объект, к которому она должна быть вызвана. Вам нужно пройти 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));
}