LINUX.ORG.RU

История изменений

Исправление ksv, (текущая версия) :

Ещё раз, медленно, с расстановкой. Можно использовать шаблоны, std::function, указатели на функции.

template<typename C> double integration1(C&& func,double a, double b, int n);
double integration2(std::function<double(double)> func,double a, double b, int n);
double integration3(double (*func)(double),double a, double b, int n);

Ни один из способов не имеет критических недостатков при прочтении. Используются все три варианта в коде одинаково.

Третий случай (указатели на функции) не рекомендуется использовать так как можно передать только саму функцию или лямбду без замыкания. Первые два варианта можно использовать с функциями, лямбдами (как с замыканиями, так и без), рукописными функторами.

std::function не даёт компилятору провести оптимизации, заинлайнить лямбду. В случае медленных функций это не имеет значения. В случае если сами функции очень быстрые, при этом integration вызывается часто - накладные расходы будут существенны (по ссылке вызов через std::function в три раза медленнее).

При использовании шаблонов несколько замедляется время компиляции. Кроме того, на каждую функцию будет сгенерирован свой собственный вариант функции integration1. Про другие недостатки я не слышал (буду раз узнать, если вы располагаете такой информацией).

Собственно, вопрос. Какие ваши аргументы за использование std::function?

Исходная версия ksv, :

Ещё раз, медленно, с расстановкой. Можно использовать шаблоны, std::function, указатели на функции.

template<typename C>
double integration1(C&& func,double a, double b, int n);
double integration2(std::function<double(double)> func,double a, double b, int n);
double integration3(double (*func)(double),double a, double b, int n);

Ни один из способов не имеет критических недостатков при прочтении. Используются все три варианта в коде одинаково.

Третий случай (указатели на функции) не рекомендуется использовать так как можно передать только саму функцию или лямбду без замыкания. Первые два варианта можно использовать с функциями, лямбдами (как с замыканиями, так и без), рукописными функторами.

std::function не даёт компилятору провести оптимизации, заинлайнить лямбду. В случае медленных функций это не имеет значения. В случае если сами функции очень быстрые, при этом integration вызывается часто - накладные расходы будут существенны (по ссылке вызов через std::function в три раза медленнее).

При использовании шаблонов несколько замедляется время компиляции. Кроме того, на каждую функцию будет сгенерирован свой собственный вариант функции integration1. Про другие недостатки я не слышал (буду раз узнать, если вы располагаете такой информацией).

Собственно, вопрос. Какие ваши аргументы за использование std::function?