【发布时间】:2014-11-05 10:26:07
【问题描述】:
我注意到 lambda 既可以使用函数指针,也可以使用专用的 function 类型使用 g++。
#include <functional>
typedef int(*fptr)(int, int);
int apply_p(fptr f, int a, int b) {
return f(a, b);
}
int apply_f(std::function<int(int, int)> f, int a, int b) {
return f(a, b);
}
void example() {
auto add = [](int a, int b) -> int {
return a + b;
};
apply_p(add, 2, 3); // doesn't give an error like I'd expect it to
apply_f(add, 2, 3);
}
我的问题是:哪些是最习惯使用的?使用其中一种有哪些危险和/或好处?
【问题讨论】:
-
今天问的this question相关。仅当 lambda 没有捕获时,转换为函数指针才有效。作为我的回答,还有另一种选择,使用模板并将 lambda 视为可调用。
std::function会产生开销,并且无法像 lambda 那样优化。 -
第二个版本可能会产生不必要的开销。我会将
apply_f设为函数模板。 -
@ShafikYaghmour wow.. 随机时间
-
@juanchopanza 所说的是 imo 最好的建议:不必关心函数指针语法,没有 std::function 的性能开销,它适用于你抛出的与调用匹配的所有内容 - 包括“原始”函数、std::functions、lambdas、您自己的运算符类
标签: c++ lambda function-pointers