c++ - C ++将类成员函数传递给其他类
问题描述
我有一个类wrapper
,它拥有类的实例trigger
。我想传递一个 to 的成员函数,wrapper
以便trigger
在某些事件上trigger
可以调用这样的函数,对wrapper
. 有可能这样做吗?
我对代码的想法是这样的:
class trigger {
public:
trigger(int trigger_thr): _trigger_thr(trigger_thr){};
trigger &operator+=(int v) {
_trigger_value += v;
check_trigger();
return *this;
}
void set_callback(someType f){
_f = f;
}
private:
int _trigger_value;
int _trigger_thr;
someType _f;
void check_trigger() {
if (_trigger_value >= _trigger_thr)
_f();
}
};
class wrapper {
public:
wrapper() {
_t.set_callback(someType some_function)
}
private:
void some_function() {/* do something */}
private:
trigger _t;
}
解决方案
引用成员函数的语法是&wrapper::some_function
. 这会创建一个指向成员函数的指针,该指针可以传递给另一个函数并存储。它的类型将是void (wrapper::*)()
并且要调用该函数,您必须具有一个类型的对象wrapper
(您不能只是凭空调用一个成员函数,您需要一个对象)。因此,要将其传递给触发器类,您还需要传递一个wrapper*
可以调用该函数的函数。给定一个p
类型指针和一个指向类型wrapper*
成员的指针,您会称它为最丑陋且最难记住的 C++ 语法形式之一。m
void (wrapper::*)()
(p->*m)()
或者,您可以使用 lambda 表达式创建一个捕获对象并调用成员函数的闭包对象:
set_callback( [this] { this->some_function(); } );
要将闭包对象存储在成员变量中,您需要使用std::function<void()>
可以存储任何可以不带参数调用的可调用对象的对象。
因此,将函数参数和成员从更改someType
为std::function<void()>
,然后在调用时使用 lambda 表达式set_callback
。然后你可以_f()
像在你当前的代码中那样调用它。
推荐阅读
- zingchart - Zingchart:以缩短格式显示值框的文本
- oracle - 无效的 ALTER TABLE 选项 ORA-01735
- mongodb - FetchError:http://localhost:3000/api/products/6092ca3460fc67315178f2fa 处的 json 响应正文无效 原因:JSON 中位置 0 处的意外令牌 <
- python - read_excel 的波斯语路径
- mongodb - Spring Boot:如何在更高的环境中通过 SRV 连接到 MongoDB,而在本地环境中连接到本地数据库
- javascript - react native:将警报更改为模态的方法
- reactjs - react css modules 导致快照测试失败
- postgresql - 用于将查询结果导出到文件的 postgres \copy 命令出现问题
- microsoft-graph-api - Graph API:DriveItem 的上传内容为 AzureChina 引发 501 not_implemented 错误
- sql - 遗漏连接返回重复记录