Передача указателя на динамическую функцию времени выполнения - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь написать универсальную служебную функцию для класса, которая применяет функцию к каждому элементу вектора, причем единственным входным аргументом является значение этого элемента.Идея заключается в том, что я могу использовать это для поддержки скалярного сложения / умножения, а также пользовательских функций без дублирования слишком большого количества кода.Он отлично работает для пользовательских функций, но я борюсь с тем, как лучше всего реализовать его для скалярного сложения / умножения.

Приведенный ниже код является упрощенной версией того, с чем я играюсь.Это работает нормально, но я хочу, чтобы «5» в лямбда-выражении представляло собой переменную, передаваемую отдельно, но не обязательно передаваемую в «apply_f».Так что продолжайте применять apply_f только с вектором и указателем на функцию.Мне известно о поле захвата для лямбда-выражений, но у меня возникли проблемы при передаче лямбда-функции с захватом в другую функцию.Я также знаю что-то вроде std :: bind, но не смог заставить это работать.

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

void apply_f(vector<double>& vec, double (*f)(double)) {
    transform(vec.begin(), vec.end(), vec.begin(), f);
}

int main() {
    vector<double> x {1, 2, 3};

    auto f = [](double x){ return x + 5; };
    apply_f(x, f);

    cout << x[0] << endl;
    cout << x[1] << endl;
    cout << x[2] << endl;
}

Ответы [ 2 ]

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

Просто возьмите параметр с уникальным типом:

template <class F>
void apply_f(vector<double>& vec, F f) {
    transform(vec.begin(), vec.end(), vec.begin(), f);
}

Мало того, что он будет работать, но вы получите намного лучшую производительность, так как компилятор знает фактический передаваемый тип.

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

К сожалению, лямбды - это не просто указатели на функции (например, потому что они могут иметь состояние).Вы можете изменить свой код, чтобы использовать std::function<double(double) вместо double(*)(double), и это может захватить лямбду (может потребоваться передать std::cref(f) вместо просто f).

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