📜  C++ 14中的广义Lambda表达式(1)

📅  最后修改于: 2023-12-03 15:13:53.823000             🧑  作者: Mango

C++ 14中的广义Lambda表达式

Lambda表达式是C++11引入的新特性,广义Lambda表达式是在C++14中新增的扩展。广义Lambda表达式让Lambda表达式更加灵活,使得C++的代码可读性更强,同时也减少了代码中的重复。

传统Lambda表达式

在传统的Lambda表达式中,我们可以定义一个变量并传递一个函数对象作为参数,例如:

auto func = [](int a, int b){ return a+b; };
cout << func(1, 2) << endl;  //输出3

这里的auto关键字表示编译器将变量类型自动推断为函数类型(也就是函数对象)。大括号内的内容是Lambda函数体,其中的[]是Lambda捕捉列表。这个例子中的Lambda表达式是一个接受两个int类型参数的函数,返回这两个参数的和。

广义Lambda表达式

广义Lambda表达式允许我们在Lambda函数体的外面使用泛型参数,例如:

template<typename T>
auto func = [](T a, T b){ return a+b; }; 
cout << func<int>(1, 2) << endl;  //输出3
cout << func<string>("Hello, ", "World!") << endl;  //输出"Hello, World!"

这里的T是一个泛型参数,可以用于任何类型。我们可以通过使用func<int>func<string>来实现将这个Lambda函数应用于不同的类型。这使得代码更加灵活,因为现在我们可以有多个不同的Lambda函数,可以用于不同类型的数据。

我们还可以将广义Lambda表达式作为函数模板参数,例如:

template<typename T, typename Func>
T operate(T a, T b, Func func){
    return func(a, b);
}
cout << operate(1, 2, func<int>) << endl;  //输出3
cout << operate(string("Hello, "), string("World!"), func<string>) << endl;  //输出"Hello, World!"

这里的Func是一个泛型参数,可以接受任何可以调用的类型,例如函数、函数对象和Lambda表达式。在函数operate内,我们传递了一个Lambda表达式作为参数func。Lambda表达式可以在运行时定义,这使得我们可以在编写代码时更加灵活。

总结

广义Lambda表达式是一种更灵活的Lambda表达式,在C++14中新增了这个扩展。通过广义Lambda表达式,我们可以使用泛型参数,并将Lambda表达式作为函数模板参数传递。这使得我们的代码更加灵活和可读性更强。