std::function实现函数指针
时间: 2023-06-26 11:03:48 浏览: 169
`std::function` 是 C++11 引入的一个通用函数封装,可以用来存储、复制和调用任何可调用对象(函数、函数指针、成员函数指针、仿函数等等)。使用 `std::function` 可以实现函数指针的功能。
下面是一个示例:
```cpp
#include <iostream>
#include <functional>
void foo(int x) {
std::cout << "foo: " << x << std::endl;
}
int main() {
std::function<void(int)> func = &foo; // 将函数指针传递给 std::function 对象
func(10); // 调用 std::function 对象,输出 "foo: 10"
return 0;
}
```
在这个示例中,我们首先定义了一个函数 `foo`,然后使用 `std::function<void(int)>` 定义了一个函数对象 `func`,该对象可以接受一个整型参数并返回 `void`,与 `foo` 函数的函数签名相同。接着,我们将 `foo` 函数的地址传递给 `func` 对象,使其指向 `foo` 函数。最后,我们通过调用 `func` 对象来调用 `foo` 函数,输出了 "foo: 10"。
需要注意的是,由于 `std::function` 是一个通用函数封装,其内部可能会涉及到动态分配内存等操作,因此在一些性能要求较高的场景中,使用函数指针可能更为适合。
相关问题
QT 调用动态库接口,用std::function实现函数指针
在Qt中调用动态库接口,可以通过使用QLibrary类来实现。QLibrary类提供了一个简单的方式来加载动态链接库,并且使其函数可用于应用程序。
下面是一个使用std::function实现函数指针的例子:
```cpp
#include <QtCore>
#include <functional>
typedef int (*Func)(int, int);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary lib("mylib");
if (lib.load()) {
// Get function pointer
Func func = (Func) lib.resolve("myfunc");
if (func) {
// Call function using std::function
std::function<int(int, int)> funcPtr = func;
int result = funcPtr(10, 20);
qDebug() << "Result: " << result;
}
}
return a.exec();
}
```
在这个例子中,我们首先使用QLibrary类加载动态链接库“mylib”。然后,我们使用QLibrary的resolve函数获取函数指针。最后,我们使用std::function将函数指针包装为函数对象,并调用函数对象来调用函数。
需要注意的是,使用std::function包装函数指针可能会带来一些性能开销。因此,在高性能的应用程序中,建议直接使用函数指针来调用函数。
std::function 传递指针函数
`std::function`是C++11引入的一个模板类,它是一个通用的功能对象,可以存储并执行各种类型的函数或函数指针。当你需要传递一个动态绑定的函数引用、成员函数指针、甚至是其他类型的函数对象时,`std::function`非常有用。
例如,你可以这样做:
```cpp
void print(int x) {
std::cout << "Prints an integer: " << x << '\n';
}
void print(double x) {
std::cout << "Prints a double: " << x << '\n';
}
int main() {
// 使用std::function存储打印整数的函数
std::function<void(int)> printInt = print;
// 后来改变了函数,传递的是打印双精度数的函数
printInt = print;
// 现在都可以通过printInt调用不同的函数
printInt(5); // 输出 "Prints an integer: 5"
printInt(3.14); // 输出 "Prints a double: 3.14"
return 0;
}
```
在这个例子中,`printInt`既可以保存`print(int)`,也可以保存`print(double)`,这就是`std::function`的灵活性。
阅读全文