簡體   English   中英

Function 指向實例成員的指針

[英]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 的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);
      }
   }
};

您可以僅使用指向成員的原始指針來執行此操作:

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::functionboost::function 使用它們的最簡單方法是使用boost::bindstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM