Передача лямбда-функции в качестве параметра C ++ - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над передачей лямбда-функций R1 и R2 в шаблонную функцию F. Но я не уверен, правильно ли я это делаю.

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

Я новичок в работе с шаблонными функциями.Таким образом, любая помощь будет высоко ценится.

//main.cpp
    #include <iostream>
    #include "Funct.h"
    using namespace std;

    int main()
    {

        auto f1 = [](long double x) { return (x * x) - 2; };
        auto f2 = [](long double x) { return (2 * x);
        auto RV1 = F<long double>(1.0L,1.0E-20L,f1(1.0L),f2(1.0L));
        return 0;


    }

    //Funct.h
    #include <iostream>
    #include<cmath>
    template<typename T> T F(long double guess, long double tolerance,T ((*f)(const T x)), T((*df)(const T x)));
    template<typename T> T F(long double guess, long double tolerance,T ((*f)(const T x)), T((*df)(const T x)))
    {

    }

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете использовать:

template <typename F1, typename F2>
long double F(long double guess,
              long double tolerance,
              F1 f,
              F2 der)
{
    f(4.2); // call function
    def(4.2);
    // ...
}

При использовании, аналогичном:

auto f = [](long double x) { return (x * x) - 2; };
auto derived = [](long double x) { return 2 * x; };
auto RV1 = F(1.0L, 1.0E-20L, f, derived);
0 голосов
/ 02 октября 2018

Во-первых, как упомянуто @tkausl, вы не должны вызывать лямбда-выражения при передаче их в качестве параметров, поскольку таким образом они автоматически оцениваются и выдают значения (в данном случае long удваивается), но ваша функция ожидает функцию какпараметр.

Вместо этого вы должны вызывать функции, которые вы даете в качестве параметров, в самой вызываемой функции (в данном случае F).

Вы можете использовать std::function для описания прототипа функции, таким образом избегая ""уродливые" указатели на функции.

Сначала вам нужно включить заголовочный файл <functional> из стандартной библиотеки.

Затем вы можете написать что-то вроде этого:

template <typename T>
using Func = std::function<T(T)>;

template <typename T>
T F(long double guess, long double tolerance, Func<T> f, Func<T> df); 

Где в std::function<long double(long double)> тип в скобках обозначает тип аргументов функции, а тип перед скобками - это тип возвращаемого значения прототипа функции;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...