实现 std::function 来实现多功能可调用性
std::function 提供了一种封装和存储任何类型的可调用性的方法,同时维护固定大小。尽管其内容大小不同(例如 lambda 表达式),std::function 通过称为类型擦除的技术实现了这种一致性。
多种可调用对象的类型擦除
类型擦除涉及创建由基类表示的公共接口。对于 std::function,callable_base 类定义了一个由派生类为特定可调用类型实现的虚函数operator()。这种方法使 std::function 能够存储指向基类的指针,从而允许它包装任何可调用对象。
由于每个可调用对象可能有不同的实现,因此派生类是通过 std::function 管理动态创建的堆内分配。
复制行为和内部状态
复制 std::function 时,内部可调用实体是复制的,而不是共享的。这种行为在以下测试中很明显:
int main() { int value = 5; typedef std::function<void()> fun; fun f1 = [=]() mutable { std::cout << value++ << '\n'; }; fun f2 = f1; f1(); // prints 5 fun f3 = f1; f2(); // prints 5 f3(); // prints 6 (copy after first increment) }
第一次调用 f1 后的增量不会影响 f2,这表明 f2 有自己的可调用实体副本。
以上是`std::function` 如何实现具有一致大小的多功能可调用性?的详细内容。更多信息请关注PHP中文网其他相关文章!