포인터를 반환하는 메소드에 대한 포인터를 입력하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/160974

  •  03-07-2019
  •  | 
  •  

문제

기본적으로 다음 수업이 있습니다.

class StateMachine {
...
StateMethod stateA();
StateMethod stateB();
...
};

메소드 statea () 및 stateb ()는 statea () 및 stateb ()로 포인터를 반환 할 수 있어야합니다. Statemethod를 입력하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

gotw #57 이 목적을 위해 암시 적 변환이있는 프록시 클래스를 사용한다고 말합니다.

struct StateMethod;
typedef StateMethod (StateMachine:: *FuncPtr)(); 
struct StateMethod
{
  StateMethod( FuncPtr pp ) : p( pp ) { }
  operator FuncPtr() { return p; }
  FuncPtr p;
};

class StateMachine {
  StateMethod stateA();
  StateMethod stateB();
};

int main()
{
  StateMachine *fsm = new StateMachine();
  FuncPtr a = fsm->stateA();  // natural usage syntax
  return 0;
}    

StateMethod StateMachine::stateA
{
  return stateA; // natural return syntax
}

StateMethod StateMachine::stateB
{
  return stateB;
}

이 솔루션에는 세 가지 주요 강점이 있습니다.

  1. 필요에 따라 문제를 해결합니다. 더 나은 것은 유형 안전하고 휴대용입니다.

  2. 기계는 투명합니다. 발신자/사용자에게는 자연스러운 구문을 얻고 기능 자체의 "반환 STATEA"에 대한 자연 구문; 성명.

  3. 아마도 오버 헤드가 없을 것입니다. 최신 컴파일러에서는 스토리지 및 기능이있는 프록시 클래스가 인라인 및 최적화를 최적화해야합니다.

다른 팁

Just Typedef 사용 :

class StateMachine {  

 public:  

  class StateMethod;     
  typedef StateMethod (StateMachine::*statemethod)();   

  class StateMethod {  

    statemethod   method; 
    StateMachine& obj; 

   public:  

    StateMethod(statemethod method_, StateMachine *obj_)  
      : method(method_), obj(*obj_) {} 

    StateMethod operator()() { return (obj.*(method))(); }  
  };  

  StateMethod stateA()  { return StateMethod(&StateMachine::stateA, this); }  

  StateMethod stateB()  { return StateMethod(&StateMachine::stateB, this); }  

};    

편집 : NJSF는 여기서 잘못을 증명했습니다. 그러나 정적 캐스팅을 유지하기에 더 간단 할 수 있으므로 나머지는 여기에 남겨 두겠습니다.

'올바른'정적 유형은 없습니다 전체 유형이 재귀이므로 :

typedef StateMethod (StateMachine::*StateMethod)();

가장 좋은 방법은 사용하는 것입니다 typedef void (StateMachine::*StateMethod)(); 그런 다음 못 생겼습니다 state = (StateMethod)(this->*state)();

추신: boost::function 적어도 내 독서에서 명시적인 반환 유형이 필요합니다. 문서: boost::function0<ReturnType>

내 철학은 원시 멤버 기능 포인터를 사용하지 않는다는 것입니다. Raw Pointer Typedef의 The Syntax는 너무 끔찍한 것을 사용하는 방법조차 알지 못합니다. 나는 boost :: function을 사용하는 것을 좋아합니다.

이것은 거의 확실히 잘못 :

class X
{
  public:
    typedef const boost::function0<Method> Method;

    // some kind of mutually recursive state machine
    Method stateA()
    { return boost::bind(&X::stateB, this); }
    Method stateB()
    { return boost::bind(&X::stateA, this); }
};

이 문제는 처음으로 눈을 만나는 것보다 훨씬 더 어렵습니다.

끔찍한 C ++ 함수 Declspec을 기억할 수 없으므로 멤버 함수를 설명하는 구문을 찾아야 할 때마다, 예를 들어, 일반적으로 올바른 구문을 표시하는 의도적 인 컴파일러 오류 만 유도합니다.

그래서 주어진 :

class StateMachine { 
    bool stateA(int someArg); 
};

Statea의 Typedef의 구문은 무엇입니까? 전혀 모른다 .. 그러니 관련이없는 것을 할당하고 컴파일러의 말을 보자.

char c = StateMachine::stateA

컴파일러 말 :

error: a value of type "bool (StateMachine::*)(int)" cannot be used to initialize 
       an entity of type "char" 

"bool (statemachine ::*) (int)"는 우리의 typedef입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top