传递动态运行时函数的指针

时间:2018-10-06 21:50:22

标签: c++ function pointers lambda

我正在尝试为一个类编写一个通用实用函数,该函数将函数应用于向量的每个元素,唯一的输入参数是该元素的值。我的想法是,我可以使用它来支持标量加/乘以及用户指定的函数,而无需复制太多代码。对于用户指定的功能,它工作得很好,但是我在为标量加法/乘法最好地实现它方面苦苦挣扎。

下面的代码是我所玩游戏的简化版本。它工作正常,但是我想做的是让lambda表达式中的“ 5”是一个单独传入的变量,但不一定传入“ apply_f”。因此,保持apply_f仅将向量作为函数指针。我知道了lambda表达式的captures字段,但是在将带有捕获的lambda函数传递到另一个函数时遇到了麻烦。我也知道类似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 :(得分:1)

只需采用唯一类型的参数:

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

它不仅可以工作,而且由于编译器知道要传递的实际类型,因此您将获得更好的性能。

答案 1 :(得分:0)

不幸的是,lambda不仅仅是函数的指针(例如,因为它们可以具有状态)。您可以更改代码以使用std::function<double(double)代替double(*)(double),这可以捕获一个lambda(您可能需要传递std::cref(f)而不是f)。 / p>