我确信之前已经问过,但是很难找到... 所以,我得到的是一个接受函数指针的函数。这个函数指针有3个参数。所以,我想传递给另一个函数,相同的指针,但填充了2个参数。
所以,像这样:
int func1 (int (*funcptr)(int, int, int)) {
return func2(funcptr(,8,9));
}
int func2 (int (*funcptr)(int)) {
return (*funcptr)(2);
}
编辑: 好的,所以我现在使用lambda
得到了这个int func2(int (*funcptr2)(int)) {
return (*funcptr2)(2);
}
int func1(int (*funcptr1)(int, int, int)) {
return func2(
[funcptr1](int i)->int {
return (*funcptr1)(i,8,9);
}
);
}
但是它给了我
“无法将参数1的func1(int (*)(int, int, int))::<lambda(int)>
转换为int (*)(int)
到int func2(int (*)(int))
”
答案 0 :(得分:2)
这称为lambda,您可以使用newer C++ versions,std :: bind,boost :: bind或boost::function来完成。
答案 1 :(得分:1)
在C中,你不能。您必须传递函数指针和两个参数。
在C ++中,您可以使用std::bind
(或旧版本中的boost::bind
)来实现此目的。
答案 2 :(得分:1)
要回答您更新的问题,捕获变量的lambda(正如您的lambda与funcptr1
一样)无法转换为函数指针。直觉上这是有道理的,因为你的lambda必须每个lambda存储这个捕获的变量;而使用函数指针无法做到这一点。
最好的解决方案可能是采用std::function
类型的参数,它是任何可调用类型的包装器:
int func2(std::function<int(int)> funcptr2) {
return funcptr2(2);
}
int func1(std::function<int(int,int,int)> funcptr1) {
return func2(
[funcptr1](int i)->int {
return funcptr1(i,8,9);
}
);
}
您还可以使用模板使您的函数适用于任何可调用类型:
template <typename F>
int func2(F funcptr2) {
return funcptr2(2);
}
template <typename F>
int func1(F funcptr1) {
return func2(
[funcptr1](int i)->int {
return funcptr1(i,8,9);
}
);
}