C ++ Как связать аргументы с функцией, которая принимает функцию? - PullRequest
1 голос
/ 03 июля 2019

У меня есть функция fx_1, которая принимает функцию и другие аргументы. Я хочу создать новую функцию f1, аргументами которой являются некоторые из fx_1. Однако я не могу использовать f1.

#include <iostream>
#include <functional>
#include <cmath>

using namespace std;
using namespace std::placeholders;

double fun_exp(double x, double* y) {
    return exp(x) - x - 1;
};
double fx_1(function<double(double, double*)> fun,
    double x0, double* data = nullptr, int order = 4) {
    return 5.0;
};

int main() {

    auto f1 = bind(fx_1, fun_exp, _2, _3, 4);
    double* x = new double;
    *x = 6.0;
    cout << f1(3.0, x) << endl; //Compile Error

    function<double(double, double*)> f2 = bind(fx_1, fun_exp, _2, _3, 4); //Error.

    function<double(double, double*)> f3 = bind<double,
        function<double(function<double(double, double*)> fun, double, double*, int)>,
        double, double*>(fx_1, fun_exp, _2, _3, 4); //Error.

}

Я думал, что f1 должен принимать аргументы типа double, double*, потому что типы аргументов 2 и 3 из fx_1 double, double *.

В f2 и f3 я пытался явно задать аргументы шаблона, однако они оба не работают.

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Нумерация местозаполнителя относится к аргументам в будущих вызовах связанной функции.
То есть bind(fx_1, fun_exp, _2, _3, 4); - это функция (-подобная), которая принимает три аргумента и использует только второй и третий, например f1(0, 3.0, x).

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

Используйте _1 и _2 или (более читабельно и не менееэффективная) лямбда-функция.

1 голос
/ 03 июля 2019
Заполнители

bind () представляют собой аргументы, переданные в созданную новую функцию, поэтому ваши '_2, _3' должны быть '_1, _2'

...