function模板类
function模板类
Beyondstd::function模板类
1.定义
std::function
是 C++11 引入的一个模板类,位于 <functional>
头文件中。它是一个通用的可调用对象包装器(function object wrapper),能够存储、复制和调用任何可以调用的目标(Callable target),这些目标包括普通函数、Lambda 表达式、函数对象(仿函数)、绑定表达式(通过 std::bind
创建的)以及其他函数对象等。
2.特点
std::function
的主要特点包括:
- 类型擦除:
std::function
通过类型擦除技术,允许你存储和调用不同类型的可调用实体,而无需关心它们的确切类型。这使得std::function
在需要存储或传递可调用实体的泛型编程和回调函数中非常有用。 - 灵活性:你可以将任何可调用实体赋值给
std::function
对象,只要该实体的调用签名与std::function
的模板参数指定的签名兼容。 - 易用性:
std::function
提供了类似于普通函数的调用语法,使得调用存储的可调用实体变得简单直观。 - 性能开销:虽然
std::function
提供了很大的灵活性,但它也可能引入一些性能开销,因为它需要动态地处理不同类型的可调用实体。在性能敏感的代码中,直接使用函数指针、Lambda 表达式或函数对象可能更为高效。
使用std::function
时,你需要指定一个函数签名作为模板参数,这个签名描述了被包装的可调用实体应该具有的形式(即返回类型和参数类型)。然后,你可以将任何与该签名兼容的可调用实体赋值给 std::function
对象,并通过该对象调用它。
3.案例演示
1 |
|
**在这个示例中,我们首先创建了一个 **std::function<int(int, int)>
类型的对象 func
,它可以存储任何接受两个 int
参数并返回 int
的可调用实体。然后,我们将一个函数 add
和一个 Lambda 表达式分别赋值给 func
,并通过 func
调用了它们。
4.<functional> 标准库
4.1概述
<functional>
是 C++ 标准库中的一个头文件,它提供了对函数对象(也称为仿函数或函子)和可调用实体的支持。这些功能主要用于泛型编程中,特别是在与算法(如 <algorithm>
中定义的那些)和标准容器(如 <vector>
、<list>
等)的交互中。<functional>
头文件定义了几个模板类和函数,这些模板类和函数可以帮助你创建和使用可调用实体。
4.2主要组件
- 函数对象(Functors):任何可以像函数那样被调用的对象都可以被视为函数对象。它们通常通过重载
operator()
来实现调用操作。<functional>
提供了一些预定义的函数对象模板,如std::plus
、std::minus
、std::multiplies
、std::divides
等,用于执行基本的算术运算。 - 绑定器(Binders):
<functional>
中的std::bind
函数可以用来创建一个新的可调用实体,这个实体会将某些固定的参数绑定到另一个可调用实体上。这在你需要部分应用函数时非常有用,即你有一个函数需要多个参数,但你只想现在提供其中的一些参数,而稍后提供其他参数。 - 函数包装器(Function Wrappers):
std::function
是一个通用的可调用对象包装器,它可以保存、复制和调用任何可调用目标(函数、Lambda 表达式、绑定表达式、函数对象等)。它提供了一种类型安全的、通用的方式来存储和调用回调函数。 - 内存和比较函数对象:
<functional>
还提供了一些用于内存和比较的函数对象,如std::mem_fn
用于生成指向成员函数的指针的包装器,以及std::less
、std::greater
等用于比较操作的函数对象。
4.3案例测试
以下是一个使用 <functional>
中组件的示例:
1 |
|
**请注意,示例中的 **std::bind
用法并不适合直接修改容器中的元素,因为 std::for_each
默认不捕获返回值。这里仅用于演示 std::bind
的基本用法。在实际应用中,对于需要修改容器元素的场景,Lambda 表达式通常是更好的选择。