Lambda 表达式在一定程度上是可以和函数对象进行互转的。例子如下:
#include <cstdio>
void testLambda() {
int i = 100;
auto f = [i]() mutable {
return ++i;
};
i = 1;
int j = f();
int k = f();
printf("Test lambda expression: ");
printf("i=%d, j=%d, k=%d\n", i, j, k);
}
void testFunctionObject() {
int i = 100;
class Add1 {
public:
Add1(int i) {
this->i = i;
}
int operator()() const {
return ++i;
}
private:
mutable int i;
} f(i);
i = 1;
int j = f();
int k = f();
printf("Test funcion object: ");
printf("i=%d, j=%d, k=%d\n", i, j, k);
}
int main() {
testLambda();
testFunctionObject();
return 0;
}
从代码中可以推测,Lambda 的捕获代码实际上对应函数对象的状态变量,如果 Lambda 表示的后面与 mutable 关键字,那么对应的变量也需要使用 mutable 关键字进行申明。默认的值捕获的形式所对应的函数对象的函数是有 const 的限定符,但是对于引用形式的捕获是没有这个限制的。
下面继续分析一个问题,Lambda 的参数问题。
新特性中 Lambda 表达式的参数类型可以使用 auto 关键字,这样就类似定义了一个模板表达式,例子如下:
auto print_vec = [](std::vector<int> vecNumber) {
for (auto i : vecNumber) {
printf("%d ", i);
}
printf("\n");
};
const char *test_split = "**************************************";
void testLambdaExpression() {
std::vector<int> vecNUmber{0, 2, 1, 3};
print_vec(vecNUmber);
std::sort(vecNUmber.begin(), vecNUmber.end(), [](auto e1, auto e2) {
return e1 > e2;
});
print_vec(vecNUmber);
}
这种表达式如何和函数对象进行对应呢?一个可行的例子如下:
class anonymous_func {
public:
template <typename T1, typename T2>
bool operator()(T1 e1, T2 e2) {
return e1 > e2;
}
} f;
void testFunctionObject() {
std::vector<int> vecNumber{0, 2, 1, 3};
print_vec(vecNumber);
std::sort(vecNumber.begin(), vecNumber.end(), f);
print_vec(vecNumber);
}
从代码中看,我们有两点不如 Lambda 表达式,第一个不能本地直接定义,就是不要通过 f 这个东西去实现,这个原因是类定义不能在表达式中完成。第二个受限是不能在函数体内定义模板相关的东西,简单说模板不能在 local class 中定义。
网友评论