2016-08-06 2 views
1

나는 책을 읽고, 코드 아래가 오전 :std :: bind가 함수에 전달 된 인수의 수를 늘리는 방법은 무엇입니까?

mActionBinding[Fire].action = derivedAction<Aircraft>(
std::bind(&Aircraft::fire, _1)); 

유도 작용에 전송되는 인수가 두 arguemnts 나중에 전송됩니다.

template<typename GameObject, typename Function>derived action function 
std::function<void(SceneNode&, sf::Time)> derivedAction(Function fn) 
{ 
    return [=](SceneNode& node, sf::Time dt) expression 
    { 
     assert(dynamic_cast<GameObject *>(&node) != nullptr); 

     fn(static_cast<GameObject &>(node), dt); 
    }; 
} 

화재의 선언은 항공기 클래스에있는 이것이다 : 나는 표준 : : 바인딩에 대한 몇 가지 기사를 읽고

class Aircraft:public SceneNode 
{ 
public: 
    void fire() 
}; 

하지만, 솔직히 나는 이걸 이런 건은 보지 못했다 훨씬 더 복잡한.

1 기반 내 독서에,이 표준 : 바인드가 세 개의 인수 :

은 내 질문을 정렬 할 수 있습니다! 멤버 함수, 암시 적 클래스 이름 및 _1 그것은 사실입니까? 우리가 derivedAction에서 호출 할 때 static_cast<gameObject &>(node) 대신 "this"가 전송됩니다.

2-fire에는 아무런 인자도 없습니다! (암시적인 this 제외) 왜 _1이 우리에게 오류를주지 않습니다? 어떻게 "dt"가 전송 될까요?

나는 조금 혼란 스럽다. 참고 문헌은 간단한 사용 예이며, std::bind에 대한 다른 정보는 높이 평가 될 것이다.

+0

@AmiTavory 님이 당신의 의견을받지 못했습니다. 무엇을 의미합니까? – shayan

+0

'bind' 멤버 함수의 첫 번째 인수는 호출 될 인스턴스입니다. 일명 "impicit this"_ –

+0

@Revolver_Ocelot ok, 두 번째 인수에 대해서는 매개 변수가 없지만 jt는이를 허용합니까? – shayan

답변

4
std::bind(&Aircraft::fire, _1) 

1) std::bind에는 두 개의 인수가 전달됩니다. 첫 번째 인수는 &Aircraft::fire이고 멤버 함수 Aircraft::fire에 대한 포인터입니다. 두 번째 인수는 std::placeholders::_1이며 어딘가에 using namespace std::placeholders이 있기 때문에 규정되지 않은 조회에서 발견됩니다.

fn(static_cast<GameObject &>(node), dt) 

2) 인수 static_cast<GameObject &>(node)_1 자리를 대체합니다. Aircraft::fire에는 하나의 매개 변수가 있으며 암시 적 this이므로 static_cast<GameObject &>(node)은 암시 적 this 인수로 Aircraft::fire으로 제공됩니다. 인수 dt_2 자리 표시자를 대체하지만, _2이 없으므로 무시됩니다.