C ++에서 간단한 콜백을 만들어야합니까? boost :: function을 사용해야합니까?

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

  •  03-07-2019
  •  | 
  •  

문제

다음과 같은 코드가 있다고 가정합니다.

class Visitor {
   public:
      Visitor(callBackFunction) {}
      void visit() {
          //do something useful
          invokeCallback();
      }
}

class ClassThatCanBeVisited {
    Visitor &visitor;

    public:
       ClassThatCanBeVisited(Visitor &_visitor) : visitor(_visitor){}
       void someUsefulMethod() {
          int data= 42;
          visitor.visit(data);
       }
};


void callBackFunction() {
    //do something useful in the context of the Main file
}
int main() {
     Visitor visitor;
     ClassThatCanBeVisited foo(visitor);
     foo.someUsefulMethod();
}

방문자 :: vison ()가 호출 될 때마다 호출되는 간단한 콜백을 만들어야합니다. 콜백 코드를 방문자 안에 넣어야한다는 것을 알고 있지만 컨텍스트에 따라 콜백 기능 ()을 방문자에게 전달하여 콜백 함수를 호출 할 수 있습니다.

나는 웹에서 물건을 찾고 Boost :: 기능을 보았지만 C ++에는 이미 기본 기능이 있습니다.

코드의 명확성을 위해 어떤 것을 사용해야합니까? 콜백은 간단한 void () 함수가 될 것이지만, 성장할 수도 있습니다. 미래를 알 수 없습니다 :)

권장하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

boost :: function을 사용하지 않으려면 콜백 인터페이스 및 계층 구조를 사용할 수 있습니다.

class VisitorCallback
{
public:
    virtual void handle( const Visitor& ) = 0;
};

부스트 :: 함수를 사용하거나 사용할 수있는 경우 사용하면 모든 콜백 클래스를 제거하는 좋은 방법입니다.

편집하다:
@edisongustavo :

boost :: function and boost :: bind는 코드를 더 읽기 쉽게 만들지 않을 것입니다. 그러나 모든 클래스의 기존 기능뿐만 아니라 무료 기능 (클래스 및 정적 클래스 함수 기능을 의미 함)을 전달할 수있는 기회를 제공합니다.

부스트 함수를 사용하면 하나의 매개 변수 만 기대하는 콜백으로서 예를 들어 2 매개 변수를 사용하여 함수를 전달할 수 있습니다.

typedef boost::function< void ( int ) > IntExpectingCallback;

void TwoIntFunction( int, int );
{
}
...
IntExpectingCallback callback = boost::bind( TwoIntFunction, 5, _1 );

그러나 다시 한 번, 모든 팀이 부스트를 알고 선호하지 않는 한 코드를 더 읽기 쉽게 만들 수는 없습니다.

다른 팁

예 BOOST :: 기능이 잘 수행됩니다. 그것은 그것의 매우 일반적인 사용법입니다. 인스턴스를 멤버 함수에 바인딩하려면 boost :: 바인드를 사용해야합니다.

 func = boost::bind( &MyClass::CallbackFunc, this);

수업 내에서 그렇게하는 방법 일 것입니다.

"이"가 해체되지 않거나 부스트 기능이 어딘가에 부스트 헤더의 중간에 충돌 할 것입니다.

위의 답변은 훌륭하지만 질문에서 언급 한 내용을 지적하고 싶습니다. 이는 여전히 C ++ 콜백 객체 (Mykola의 답변)와 부스트 중에서 선택하는 것과 관련이 있습니다.

"콜백은 간단한 무효 () 기능이 될 것이지만, 성장할 수도 있습니다. 미래를 알 수 없습니다 :)"

이것은 아마도 불필요한 기능을 추가하고 불필요한 기능을하는 최악의 이유 일 것입니다. 즉 "필요한 경우를 대비하여"입니다. 당신이 모른다면 - 필요한 것 이상을하지 않는다면, 특히 필요할 때까지 당신의 추측이 잘못 될 것입니다.

반면에, 당신이 그것을 알고 있다면 그것은 당신이 기능이 필요할 가능성이 매우 높습니다. 금방, 그러면 추가 할 가치가있을 수 있습니다.

다시 Mykola가 말한 내용을 다시 말하면 - 이미 프로젝트에 부스트가 있고 팀이 좋아한다면이를 사용하지만 그렇지 않으면 과잉 일 수 있습니다.

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