2010-06-01 2 views
0

함수 참조에 대한 또 다른 질문이 있습니다. 예를 들어 , 나는 그런 정의가 :함수 참조로 작업

typedef boost::function<bool (Entity &handle)> behaviorRef; 
std::map< std::string, ptr_vector<behaviorRef> > eventAssociation; 

되는 첫 번째 질문 : 어떻게 같은 맵 오브젝트에 값을 삽입하는?

내가 시도 :

eventAssociation.insert(std::pair< std::string, ptr_vector<behaviorRef> >(eventType, ptr_vector<behaviorRef>(callback))); 

그러나 오류 :

no matching function for call to ‘boost::ptr_vector<boost::function<bool(Entity&)> >::push_back(Entity::behaviorRef&)’ 

그리고 내가 undersatnd하지만, 실행 가능한 코드를 만들 수 없습니다.

두 번째 질문은 이러한 함수를 호출하는 방법입니다. 예를 들어, behaviorRef의 객체가 하나 있는데, boost :: bind으로 값을 전달하는 방법은 무엇입니까?

+1

팁으로 직접 쌍을 구성하는 대신에'std :: make_pair()'를 사용할 수 있습니다. 이렇게하면 쌍의 템플리트 매개 변수를 작성하지 않아도됩니다. –

+0

@ james-mcnellis 팁 주셔서 감사합니다! – Ockonal

답변

2

1 부

ptr_vector를 사용할 필요가 없습니다. boost::function은 값 의미를 가지므로 표준 컨테이너에 저장할 수 있습니다. 그래서 다음과 같은 작업을해야합니다 :

typedef boost::function<bool (Entity &handle)> behaviorRef; 
std::map< std::string, std::vector<behaviorRef> > eventAssociation; 

eventAssociation.insert(std::make_pair(eventType, vector<behaviorRef>(1, callback))); 

참고 vector 생성자에 두 개의 인수.

이 필요했던 경우 ptr_vector (당신이 noncopyable 유형을 사용했기 때문에) ptr_vector는 벡터 웁니다 생성자가 없기 때문에, 당신은 다음과 같은 것을해야 할 것 :

ptr_vector<behaviorRef> behaviours; 
behaviours.push_back(new behaviourRef(callback)); 
eventAssociation.insert(std::make_pair(eventType, behaviours)); 

을 2 부

기능을 호출하는 데 boost::bind을 사용할 필요는 없습니다 (처음부터 사용할 수는 있지만).그것을 호출하는 구문은 일반적인 함수와 같습니다 :

+0

고마워,하지만 왜 std :: vector 두 argmuments 전달하는지 이해할 수 없다? – Ockonal

+2

@Ockonal : 첫 번째 인수는 벡터의 크기 (즉, 처음에 보유한 객체의 수)이고, 두 번째 인수는 처음 생성 된 객체를 복사 생성하는 데 사용될 객체입니다. 예 :'벡터 (10, some_foo) '는 some_foo의 10 개의 클론을 포함하는 벡터를 만듭니다. –

+0

좋습니다. 감사. – Ockonal

3

첫 번째 질문 :

ptr_vector<Foo> 푸 포인터를 포함합니다. 따라서 ptr_vector을 사용해야하는 경우 (함수 객체가 비싸기 때문에) behaviorRef에 대한 포인터를 push_back해야합니다.

번째 질문 부 : behaviorRef는 ㄱ bool(Entity&) 함수보다 동일한 구문이라고

A :

// Somehow get an Entity and a behaviorRef 
Entity some_entity = ...; 
behaviorRef some_behavior = ...; 

// Call the behaviorRef 
bool result = some_behavior(some_entity); 

번째 질문 2 부 :

behaviorRef 다른 함수 객체와 같은 방법으로 boost :: bind와 함께 사용할 수 있습니다 :

// Somehow get an Entity and a behaviorRef 
Entity some_entity = ...; 
behaviorRef some_behavior = ...; 

// Make a new function object, bound to some_entity 
boost::function<bool()> bound_behavior = boost::bind(some_behavior, some_entity); 

// Call the bound function. 
bool result = bound_behavior(); 
+0

두 번째 질문에 대한 귀하의 대답은 훌륭합니다. 감사합니다! 나는 두 가지 대답을 표시 할 수 없다는 점이 유감이다. – Ockonal