2011-06-09 61 views
1

我需要一些状态映射到类的特定成员函数,用于(一个非常减少)例如:函数指针实例成员

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(不能使用第三党东西像升压),什么是_a_ptr_to_some_member的类型,我如何绑定的方法UpdateGuiForStopState呢?

大概我使用STL mem_xxx的东西,但不能工作如何。

是的,我能做到这一点一百和另外一个不同的方式,但我想看看,如果这种方式是可行的。

回答

1

使用STL的bind1stmem_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); 
     } 
    } 
}; 
1

您可以直接用裸指针成员做到这一点:

typedef void (Z::*_a_ptr_to_some_member)(State s); 
_a_ptr_to_some_member _p; 
... 
_p = &Z::UpdateGuiForStopState; 
... 
(this->*_p)(s); 

这是一个有点老同学这些天,语法有点毛茸茸,但它应该工作。 (警告:我还没有尝试过。)

第一比特定义了正确类型的指针成员函数,并声明类型的成员变量。

第二位初始化_p指向正确的函数(你不能缩短这个,这是必要的语法)。

第三位调用成员函数指向_p;要做到这一点,你必须提供Z的实例 - 在这种情况下,一个由该指向。我认为需要额外的括号。运营商的优先权有点怪异。

TBH我可能会使用绑定(从升压,TR1,或C++ 11),用于此;它稍微慢一点,但更容易和更灵活。

1

如果您没有C++ 0x/TR1支持,则应该使用std::functionboost::function。使用起来会使用boost::bindstd::bind最简单的方法,当boost::bind是更好更简单,我不会使用标准的bind1st和这样的烂摊子。

0

这里是一个工作示例(参见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) ; 
    }