![](/img/trans.png)
[英]How to fill a function pointer member with class instance member function pointer?
[英]Function pointer to an instance member
我需要 map 一些 state 到 ZA2F2ED4F8EBC2CBB14C21A29DC 的特定成員 function
class Z {
_a_ptr_to_some_member _p;
void UpdateGuiForStopState(State s) {
// do something with state
}
Z() {
// setup _p to point to UpdateGuiForStopState
}
void StateComesInHere(State s) {
if(s.id == STOP_ID) { // eventually use lookup
_p(s);
}
}
}
僅使用 STL(不能使用諸如 boost 之類的第三方東西),_a_ptr_to_some_member 的類型是什么,如何將 UpdateGuiForStopState 方法綁定到它?
大概我使用了 stl mem_xxx 東西,但不知道怎么做。
是的,我可以通過其他一百零一種不同的方式做到這一點,但我想弄清楚這種方式是否可行。
使用 STL 的bind1st
和mem_fun
:
class Z3 {
typedef std::mem_fun1_t<void,Z3,State> _a_ptr_to_some_member_raw;
typedef std::binder1st<_a_ptr_to_some_member_raw> _a_ptr_to_some_member;
_a_ptr_to_some_member _p;
void UpdateGuiForStopState(State s) {
// do something with state
}
Z3() : _p(std::bind1st(std::mem_fun(&Z3::UpdateGuiForStopState), this))
{
}
void StateComesInHere(State s) {
if(s.id == STOP_ID) { // eventually use lookup
_p(s);
}
}
};
您可以僅使用指向成員的原始指針來執行此操作:
typedef void (Z::*_a_ptr_to_some_member)(State s);
_a_ptr_to_some_member _p;
...
_p = &Z::UpdateGuiForStopState;
...
(this->*_p)(s);
這些天這有點老派,語法有點毛茸茸,但它應該工作。 (警告:我沒試過。)
第一位定義指向成員 function 的指針的正確類型,並聲明該類型的成員變量。
第二位初始化 _p 以指向正確的 function (您不能縮短它,這是必需的語法)。
第三位調用_p指向的成員function; 為此,您必須提供 Z 的一個實例——在這種情況下,就是 this 指向的那個。 我認為需要額外的括號; 運算符優先級有點奇怪。
TBH 我可能會為此使用 bind(來自 boost、tr1 或 C++11); 它的速度非常慢,但更容易和更靈活。
如果您沒有 C++0x/TR1 支持,您應該使用std::function
或boost::function
。 使用它們的最簡單方法是使用boost::bind
或std::bind
,當boost::bind
更好更容易時,我不會使用標准的bind1st
和這樣的混亂。
這是一個工作示例(參見http://ideone.com/VEmRZ ):
#include <iostream>
typedef enum { s0, s1, s2 } State ;
class Z {
public:
void f0 (State s) { std::cout << "f0" << std::endl ; }
void f1 (State s) { std::cout << "f1" << std::endl ; }
} ;
typedef void (Z::*_a_ptr_to_some_member)(State s);
int main()
{
Z z ;
_a_ptr_to_some_member _p = &Z::f0 ;
(z.*_p)(s0) ;
_p = &Z::f1 ;
(z.*_p)(s2) ;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.