c++ - 如何正确传递成员函数作为参数
问题描述
如何正确传递成员函数作为参数?
我的代码:
#include <iostream>
using namespace std;
class Test
{
public:
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
typedef int (*funcPtr)(int a, int b);
int myFunc(funcPtr func, int a, int b)
{
return func(a, b);
}
void setup()
{
cout << myFunc(&Test::add, 5, 3) << endl;
cout << myFunc(&Test::sub, 5, 3) << endl;
}
};
int main()
{
Test test;
test.setup();
}
结果:
错误:无法使用'int (Test:: )(int, int)'类型的右值初始化 'Test::funcPtr' 类型的参数(又名 'int ( )(int, int)')
预期结果:
8
2
解决方案
您的方法应该是“常规”功能。添加static
到它们以允许将它们与函数指针一起使用:
class Test
{
public:
static int add(int a, int b)
{
return a + b;
}
static int sub(int a, int b)
{
return a - b;
}
// ...
};
如果你真的指向方法,你应该替换int (*funcPtr)(int a, int b)
并int (Test::*funcPtr)(int a, int b)
使用类似的东西:
class Test
{
public:
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
typedef int (Test::*funcPtr)(int a, int b);
int myFunc(funcPtr func, int a, int b)
{
return (this->*func)(a, b);
}
void setup()
{
cout << myFunc(&Test::add, 5, 3) << endl;
cout << myFunc(&Test::sub, 5, 3) << endl;
}
};
推荐阅读
- php - Codeigniter API:如何根据 Codeigniter API 中的用户时区从 mysql 数据库中获取数据?
- azure - Azure Web 应用程序 - 扩展、推送和 MySQL 按钮无法单击/禁用
- ios - Xcode 接口生成器未检测到 Admob 框架类
- reactjs - ApolloClient 的 SchemaLink 和 HttpLink 有什么区别?
- python - request.is_ajax() ajax 请求在 Django 中不起作用
- react-native - 检查已安装的 npm 版本时,不同的命令会给出不同的 npm 版本
- javascript - 我如何附加值并将取决于来自 ` 的数据
- python - cx_Oracle.DatabaseError: ORA-00911: 无效字符
- python - 我已经安装了请求,但我仍然收到 ModuleNotFoundError: No module named 'requests' 错误
- ios - 错误:您的项目是否缺少 Flutter 中的 ios/Runner/Info.plist