C 中的 std::function 与函数指针:选择哪个以及何时选择?
当涉及到在 C 中定义回调函数时,您有两个主要选项:C 风格函数指针和 std::function。这种选择可以显着影响代码的功能和效率。
C 风格函数指针
函数指针已经存在很长时间并且仍然被广泛使用。它们提供了存储指向函数的指针的简单性:
void (*callbackFunc)(int);
但是,它们有一个显着的限制:
缺乏上下文捕获:函数指针不能保留父函数的上下文(例如,捕获的变量)。这意味着您无法轻松传递 lambda 函数或调用对象的成员函数作为回调。
std::function
std::function (在 C 11 中引入)是旨在克服这些限制。它提供了一种类型安全、通用的方式来存储和传递函数:
std::function< void(int) > callbackFunc;
std::function 的优点:
std::function 的缺点:
模板参数
第三种选择,特别适合小型函数,是使用可调用对象类型的模板参数:
template <typename CallbackFunction> void myFunction(..., CallbackFunction && callback) { ... callback(...); ... }
模板参数的优点:
模板参数的缺点:
汇总表
总而言之,下表概述了这些选项之间的主要区别:
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Context Capture | No | Yes | Yes |
Call Overhead | No | Yes | No |
Inlining | No | No | Yes |
Class Member Storage | Yes | Yes | No |
C 11 Support | Yes | No | Yes |
Readability | Less Readable | More Readable | Somewhat Readable |
大多数情况下,除非您对函数指针或模板参数有特定要求,std::function 是首选,因为它具有灵活性、上下文捕获功能和通用兼容性。
以上是std::function 与函数指针:什么时候应该在 C 中选择每个函数?的详细内容。更多信息请关注PHP中文网其他相关文章!