, int, int)> add_func = std::mem_fn(&Calculator::add);std::cout << "Add Result: " << add_func(&calc, 5, 3) << std::endl;// 使用 std::bind 部分绑定参数auto subtract_func = std::bind(&Calculator::subtract, &calc, std::placeholders::_1, 4);std::cout << "Subtract Result: " << subtract_func(10) << std::endl;return 0;
}
```---## 总结`` 提供了一组强大的工具,使得 C++ 编程更加灵活和高效。无论是处理函数对象、动态函数调用,还是成员函数绑定,`` 都能提供简洁而优雅的解决方案。掌握这些工具,能够显著提升代码的设计能力和运行效率。
C++ Functional
简介C++11 引入了 `` 头文件,提供了丰富的工具来支持函数对象、函数包装和复合操作。`` 提供了诸如 `std::function`、`std::bind` 和 `std::mem_fn` 等核心功能,极大地增强了代码的灵活性和可复用性。本文将详细介绍 `` 的主要特性及其应用场景。---
多级标题1. 函数对象与适配器
2. std::function 的使用
3. std::bind 的灵活绑定
4. 成员函数指针与 std::mem_fn
5. 示例代码解析---
内容详细说明
1. 函数对象与适配器在 C++ 中,函数对象(Function Objects)是一种可以像普通函数一样调用的对象。它通常通过重载 `operator()` 实现。适配器(Adapters)则是对现有函数或函数对象进行封装,以适应特定的需求。`` 提供了一些常用的适配器,如 `std::not1`、`std::unary_function` 和 `std::binary_function`。
示例代码:```cpp
include
include // 自定义函数对象
struct Add {int operator()(int a, int b) const {return a + b;}
};int main() {Add add;std::cout << "Add(2, 3): " << add(2, 3) << std::endl;// 使用适配器auto negate = std::not1(std::ptr_fun(add));std::cout << "Negate(2, 3): " << !negate(2, 3) << std::endl;return 0;
}
```
2. std::function 的使用`std::function` 是一个通用的函数包装器,它可以存储任何可调用对象(包括函数指针、lambda 表达式、函数对象等)。这种灵活性使得 `std::function` 在需要动态选择执行逻辑时非常有用。
示例代码:```cpp
include
include void print(const std::string& msg) {std::cout << msg << std::endl;
}int main() {std::function func;// 使用函数指针func = print;func("Hello World");// 使用 lambda 表达式func = [](const std::string& s) { std::cout << s << " (Lambda)" << std::endl; };func("Lambda Example");return 0;
}
```
3. std::bind 的灵活绑定`std::bind` 允许将函数与其参数绑定在一起,从而生成一个新的可调用对象。这在需要部分应用参数时特别有用。
示例代码:```cpp
include
include int multiply(int x, int y) {return x * y;
}int main() {auto bound_multiply = std::bind(multiply, 2, std::placeholders::_1);std::cout << "Bound Multiply: " << bound_multiply(3) << std::endl;return 0;
}
```
4. 成员函数指针与 std::mem_fn`std::mem_fn` 是一个适配器,用于将成员函数指针转换为可调用对象。这对于处理类的成员函数非常方便。
示例代码:```cpp
include
include class MyClass {
public:void greet(const std::string& name) {std::cout << "Hello, " << name << "!" << std::endl;}
};int main() {MyClass obj;auto greet_method = std::mem_fn(&MyClass::greet);greet_method(&obj, "Alice");return 0;
}
```
5. 示例代码解析下面是一个综合示例,展示了如何结合使用 `std::function`、`std::bind` 和 `std::mem_fn` 来实现灵活的功能。
示例代码:```cpp
include
include class Calculator {
public:int add(int a, int b) {return a + b;}int subtract(int a, int b) {return a - b;}
};int main() {Calculator calc;// 使用 std::function 包装成员函数std::function add_func = std::mem_fn(&Calculator::add);std::cout << "Add Result: " << add_func(&calc, 5, 3) << std::endl;// 使用 std::bind 部分绑定参数auto subtract_func = std::bind(&Calculator::subtract, &calc, std::placeholders::_1, 4);std::cout << "Subtract Result: " << subtract_func(10) << std::endl;return 0;
}
```---
总结`` 提供了一组强大的工具,使得 C++ 编程更加灵活和高效。无论是处理函数对象、动态函数调用,还是成员函数绑定,`` 都能提供简洁而优雅的解决方案。掌握这些工具,能够显著提升代码的设计能力和运行效率。