Большинство ответов, которые я видел для этого вопроса, полагаются на std::function
и/или C++ шаблоны. Я хотел поделиться альтернативным решением, которое может быть менее общим, но мне проще. Он не использует std::function
или шаблоны --- на самом деле он вообще не использует библиотеки.
Идея состоит в том, что вместо прохождения указателя функции вы обходите объект, реализующий конкретный «интерфейс». В этом примере,
double integrator(double (*func_to_integrate)(double,double))
становится
double integrator(Integratable func_to_integrate)
, где Integratable
является 'интерфейс' (абстрактный базовый класс) определяется как
class Integratable {
public:
virtual double compute(double x, double y) = 0; // pure virtual function
}
Затем мы можем сделать func_to_integrate
в экземпляр этого класса с дополнительными элементами для дополнительных параметров:
class SomeClassName : public Integratable {
public:
double compute(double x, double y);
double mu;
double w0;
}
SomeClassName func_to_integrate;
Чтобы проверить несколько значений mu
и w0
в цикле:
for(double mu : mus) {
for(double w0 : w0s) {
func_to_integrate.mu = mu;
func_to_integrate.w0 = w0;
integrator(func_to_integrate);
}
}
Конечно, мы должны изменить integrator
так, что вместо вызова указатель на функцию, он вызывает compute()
метод объекта, переданного это, но это тривиально (если вы можете изменить подпись integrator
, что, вероятно, необходимо для любого возможного решения этой проблемы).
Мне нравится это решение, потому что оно позволяет избежать некоторых более сложных функций и библиотек C++. Однако он, конечно, менее общий, чем многие другие решения, которые часто предлагаются для частичного применения на C++. Для OP я считаю, что это решение является элегантным подгонки для данного варианта использования.
Когда 'интегратор' называет' func_to_integrate', какими должны быть значения 'mu' и' w0'? Возможно, вы захотите изучить [лямбда-функции] (http://en.cppreference.com/w/cpp/language/lambda) или ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) – Cornstalks
Они должны быть в нескольких двойниках, которыми я могу манипулировать в цикле. Я пробовал функции лямбда и связывал. Для обоих я не смог создать объект, который бы принял интегратор. – Cukhen
Почему ваша функция и интегратор не возвращают 'double'? –