我正在尝试为一个类编写一个通用实用函数,该函数将函数应用于向量的每个元素,唯一的输入参数是该元素的值。我的想法是,我可以使用它来支持标量加/乘以及用户指定的函数,而无需复制太多代码。对于用户指定的功能,它工作得很好,但是我在为标量加法/乘法最好地实现它方面苦苦挣扎。
下面的代码是我所玩游戏的简化版本。它工作正常,但是我想做的是让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;
}
答案 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>