首页 >后端开发 >C++ >`std::function` 如何实现具有一致大小的多功能可调用性?

`std::function` 如何实现具有一致大小的多功能可调用性?

Susan Sarandon
Susan Sarandon原创
2024-12-02 11:49:14494浏览

How Does `std::function` Achieve Versatile Callability with Consistent Size?

实现 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn