Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为动态运行时函数传递指针_C++_Function_Pointers_Lambda - Fatal编程技术网

C++ 为动态运行时函数传递指针

C++ 为动态运行时函数传递指针,c++,function,pointers,lambda,C++,Function,Pointers,Lambda,我试图为一个类编写一个通用实用函数,该类将函数应用于向量的每个元素,唯一的输入参数是该元素的值。我的想法是,我可以使用它来支持标量加法/乘法以及用户指定的函数,而无需复制太多代码。它适用于用户指定的函数,但我正在为如何最好地实现标量加法/乘法而苦苦挣扎 下面的代码是我正在玩的东西的简化版本。它工作得很好,但我希望能够让lambda表达式中的“5”成为单独传入的变量,但不一定要传入“apply\u f”。因此,保持apply_f只取一个向量和一个函数指针。我知道lambda表达式的captures

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

下面的代码是我正在玩的东西的简化版本。它工作得很好,但我希望能够让lambda表达式中的“5”成为单独传入的变量,但不一定要传入“apply\u 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;
}
#包括
#包括
#包括
使用名称空间std;
无效应用(向量和向量,双(*f)(双)){
转换(vec.begin(),vec.end(),vec.begin(),f);
}
int main(){
向量x{1,2,3};
自动f=[](双x){返回x+5;};
应用f(x,f);

cout不幸的是,lambda不仅仅是指向函数的指针(例如,因为它们可以有状态)。您可以将代码更改为使用
std::function,只需获取具有唯一类型的参数:

template <class F>
void apply_f(vector<double>& vec, F f) {
    transform(vec.begin(), vec.end(), vec.begin(), f);
}
模板
无效应用(向量&vec,f){
转换(vec.begin(),vec.end(),vec.begin(),f);
}

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

我遇到了问题和“无法使其工作”不要帮助他人提供解决方案。您还尝试了什么,特别是哪些不起作用?据我所知,我无法将带有捕获的lambda函数作为指针传递给另一个函数。错误:无法将参数“2”的“main()::”转换为“double()(double)”到“void applyf(std::vector&,double()(double))'是否需要这样的通用性?你能像stdlib算法那样简单地传入一个模板化的可调用类型吗?@下划线\u d是的,使用模板似乎比我想做的要好,谢谢。我不明白为什么
[c]ref()
将是必需的。也不清楚OP是否真的需要使用std::function的重型类型擦除,或者可能只是传入一个模板化的可调用类型,比如stdlib算法。这就是为什么我说“可以”,这将取决于实际的代码。但是,是的,可能使用
templatevoid apply\f(vector&vec,tf)
可能就足够了。我倾向于通过
常量传递functor&
,但我猜你是在复制,因为你希望所有的functor都足够小,通过引用传递不会因为间接寻址而带来任何好处或轻微的开销,尽管内联可以使它们完全相同,可能在很多情况下。我要添加的另一件事是在在函子需要保持可变状态的情况下,它将被传递给stdlib算法,它们将希望通过
std::ref()传递它
为了获得一个
引用
包装,为了确保调用之间状态的更新实际上保持不变,因为各种stdlib算法都是通过复制来获取函子的。@下划线
std::transform
根据值来获取它,所以在这种情况下,最好的选择就是这样做。对于可变状态函子,这正进入危险的领域:在ma中在任何情况下,它们对标准算法都没有多大用处(例如,
std::transform
不能保证调用的顺序)。在现在的并行算法中更是如此!的确,如果函子有副作用,而其应用顺序很重要,则使用
transform()
不是正确的选择(我假设大多数情况下都是这样),因此在这些情况下必须使用
for_each()
(或范围-
for
,等等)。