目录
一、闭包
🍅 闭包的定义
🍆 闭包实现的三种方式:
重载operator()
lambda表达式
std::bind
二、可调用对象与function (C++ Primer P511)
🥑 C++语言中的可调用对象
🥦 这五种对象类型都不同,有没有一种类型可以容纳所有?
一、闭包
🍅 闭包的定义
闭包:带有上下文状态的函数。(有些函数的参数列表已经不能改变)
例如:
std::vector<std::string> wordVec{"fun", "hello", "world"};int sz = 4;
auto wc = find_if(wordVec.begin(), wordVec.end(), [sz](const std::string &a){ return a.size() >= sz; });
find_if函数中第三个lambda表达式不一定需要通过参数列表来进行传递参数,可以通过捕获列表来获取
🍆 闭包实现的三种方式:
-
重载operator()
-
lambda表达式
#include <iostream> #include <functional>class Adder { public:// 构造函数,初始化要添加的值explicit Adder(int value) : valueToAdd(value) {}// 重载()运算符以实现闭包行为int operator()(int x) const {return x + valueToAdd;}private:int valueToAdd; // 要添加到传入参数的值 };// 使用lambda表达式实现的闭包 std::function<int(int)> make_adder_lambda(int value) {return [value](int x) { return x + value; }; }int main() {// 使用类实现的闭包Adder add5(5);std::cout << "Using class-based closure: " << add5(10) << std::endl;// 使用lambda表达式实现的闭包auto add10 = make_adder_lambda(10);std::cout << "Using lambda-based closure: " << add10(20) << std::endl;return 0; }
-
std::bind
#include <iostream> #include <algorithm> #include <functional> #include <string> #include <vector> #include <map>bool isShorter(const std::string &a, int sz) {return a.size() >= sz; }int main() {using namespace std::placeholders;auto fun = std::bind(isShorter, _1, sz);auto wc2 = find_if(wordVec.begin(), wordVec.end(), fun);return 0; }
二、可调用对象与function (C++ Primer P511)
🥑 C++语言中的可调用对象
- 函数
- 函数指针
- lambda表达式
- std::bind
- 重载函数调用运算符
🥦 这五种对象类型都不同,有没有一种类型可以容纳所有?
有。std::function
#include <iostream>
#include <functional> // for std::function, std::bind
#include <memory> // for std::make_unique// 普通函数
void regularFunction(int x) {std::cout << "Regular function: " << x << std::endl;
}// 函数对象(重载了()运算符)
struct Functor {void operator()(int x) const {std::cout << "Functor: " << x << std::endl;}
};// Lambda 表达式 (定义在 main 函数中)// 使用 std::bind 绑定成员函数
class MyClass {
public:void memberFunction(int x) {std::cout << "Member function of MyClass: " << x << std::endl;}
};int main() {// 创建 std::function 对象来存储不同类型的可调用对象std::function<void(int)> func;// 1. 普通函数func = regularFunction;func(42);// 2. 函数指针void (*funcPtr)(int) = regularFunction;func = funcPtr;func(43);// 3. lambda 表达式auto lambda = [](int x) { std::cout << "Lambda: " << x << std::endl; };func = lambda;func(44);// 4. 使用 std::bind 绑定成员函数auto myClassInstance = std::make_unique<MyClass>();func = std::bind(&MyClass::memberFunction, myClassInstance.get(), std::placeholders::_1);func(45);// 5. 重载函数调用运算符Functor functor;func = functor;func(46);return 0;
}