📅  最后修改于: 2023-12-03 15:25:16.540000             🧑  作者: Mango
在编程中,函数指针是一个容易被忽略的概念,但是它在某些场景下是非常有用的。尤其是在需要动态调用不同的函数时,使用函数指针提高了代码的可扩展性和可维护性。本文将介绍如何将函数指针转为可调用的方法,并提供一些示例代码。
函数指针是指一个指针变量,它指向一个函数。一般我们可以通过以下方式定义函数指针:
返回值类型 (*指针变量名)(参数列表)
例如,我们定义一个函数指针可以指向一个返回值为 int,参数为两个 int 类型的函数:
int (*func_ptr)(int, int);
我们可以通过将函数名作为参数来将其赋值给函数指针:
int sum(int a, int b) {
return a + b;
}
func_ptr = sum;
这里,func_ptr
指向函数 sum
,我们可以通过调用 func_ptr
来调用 sum
函数:
int result = func_ptr(3, 4); // result = 7
如果我们需要将函数指针转为可调用的方法,可以使用类成员函数中的 std::mem_fn
函数。该函数可以将一个指向成员函数的指针转换为一个可调用对象。
假设我们有一个函数指针 func_ptr
,它指向一个返回值为 int,参数为两个 int 类型的函数。我们可以使用以下代码将其转换为可调用对象:
auto callable = std::mem_fn(func_ptr);
现在 callable
是一个可调用对象,我们可以直接通过调用 callable
来调用原来的函数:
int result = callable(3, 4); // result = 7
下面给出一个示例代码,演示了如何使用函数指针和 std::mem_fn
来实现一个可调用对象的动态调用。
#include <iostream>
#include <functional>
using namespace std;
int sum(int a, int b) {
return a + b;
}
int diff(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int main() {
int op;
int a, b;
int (*op_func)(int, int) = nullptr;
function<int(int, int)> callable;
while (true) {
cout << "Menu:" << endl;
cout << "1. sum" << endl;
cout << "2. diff" << endl;
cout << "3. mul" << endl;
cout << "0. exit" << endl;
cin >> op;
switch (op) {
case 1:
op_func = sum;
break;
case 2:
op_func = diff;
break;
case 3:
op_func = mul;
break;
case 0:
return 0;
default:
continue;
}
callable = std::mem_fn(op_func);
cin >> a >> b;
cout << "result: " << callable(a, b) << endl;
}
}
在上面的代码中,我们定义了三个函数用来进行加减乘运算。在运行程序时,会出现一个菜单,我们可以选择要使用的运算,然后输入两个数进行计算。这里使用了 std::mem_fn
函数将函数指针转换为可调用对象,从而实现了动态调用不同函数的功能。
本文介绍了如何将函数指针转为可调用的方法,并提供了一些示例代码。函数指针是一个有用的概念,它可以提高代码的可扩展性和可维护性。通过将函数指针转换为可调用对象,我们可以在类成员函数中方便地使用函数指针。