Один из способов - изменить сигнатуру корневого искателя (добавьте #include <functional>
):
double OneDimBisector(std::function<double(float)> f, float a, float b, float tol);
Затем вызовите его с помощью bind
:
T1 = OneDimBisector(std::bind(pfunctForT_PS, this, std::placeholders::_1),
Tmin, Tmax, tol);
Это несет определенные накладные расходы. Если вы не возражаете против дублирования кода, вы можете сделать функцию шаблоном:
template <typename Func>
double OneDimBisector(Func f, float a, float b, float tol);
Вы вызываете его таким же образом, но каждый раз, когда у вас появляется новый тип функции, в вашем компиляторе создается новый экземпляр шаблона.
«Традиционное» решение состоит в том, чтобы иметь свободную (или статическую) функцию, которая принимает дополнительный аргумент экземпляра.
Обновление: «Традиционное решение»:
double OneDimBisector(double(*f)(float, void *), void * data, ...);
double EOSBisect(float f, void * data)
{
EOS * e = static_cast<EOS *>(data); // very "traditional"
return e->functorForT_PS(f);
}
Использование: T1 = OneDimBisector(EOSBisect, this, Tmin, Tmax, tol);