如何翻译这个给定代码中的 ::* 运算符和member_fn?
How to translate ::* operator and member_fn in this given code?
据我所知:void (A::*p)() = &A::test_func;
意味着p
是指向成员函数void A::test_func()
的指针,std::mem_fn(...)
可用于包装指向成员函数的指针。
但是在下面的代码片段中,我无法翻译void (Handler::*)()
和Handler::*member_fn
的意思。
class Handler;
std::pair<boost::shared_ptr<Handler>, void (Handler::*)()> cb = job_queue.sync_pop();
void (Handler::*member_fn)() = cb.second;
(cb.first.get()->*member_fn)();
它的意思正是您在第一段中描述的内容:
// cb contains a shared pointer to an instance of Handler and a member function of Hander
std::pair<boost::shared_ptr<Handler>, void (Handler::*)()> cb = job_queue.sync_pop();
// assign the member function stored in cb.second to a local variable
void (Handler::*member_fn)() = cb.second;
(cb.first.get()->*member_fn)(); // call the function stored in member_fn on
// the object held by cb.first
如果这还不够干净,你可以在这里找到一个使用标准库类的最小示例,它做同样的事情
class Handler;
std::pair< // a pair consisting of first and second
boost::shared_ptr<Handler>, // first - a shared pointer to Handler object
void (Handler::*)()> // second - a pointer to the member function of Handler class
cb = job_queue.sync_pop(); // sync_pop() returns such pair, stores it in cb variable
// varaible "member_fn" stores pointer to a member function from the pair
void (Handler::*member_fn)() = cb.second;
// cb.first.get()-> - dereference pointer to Handler object, say handlerObj
// *member_fn - dereference the pointer to member function
// (cb.first.get()->.*member_fn())() - invoke the function stored in member_fn variable
// on handlerObj (just like handlerObj.member_fn();)
(cb.first.get()->*member_fn)();
这将更具可读性:
auto pair = job_queue.sync_pop();
auto function = std::bind(pair.second, pair.first.get());
function();
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 重载的'dereference'或'member of pointer'运算符在我有指向对象的指针时不会运行
- 在头文件上为类声明 = 和 [] 运算符,"must be a nonstatic member function"错误
- 了解重载运算符。收到"non-standard syntax; use '&' to create a pointer to a member"错误