게임용 이벤트 시스템을 작성하려고합니다. 내 이벤트 관리자가 저장할 콜백은 펑터뿐만 아니라 일반 함수가 될 수 있습니다. 또한 함수/펑터를 비교할 수 있어야하므로 이벤트 관리자와의 연결을 끊어야하는지 알 수 있습니다.메시징 시스템 : 콜백은 무엇이든 가능합니다
• 처음에는 boost :: function을 사용해 보았습니다. 함수와 펑터를 완벽하게 처리하지만, operator ==가 없기 때문에 원하는 경우 콜백을 제거 할 수 없습니다.
class EventManager
{
typedef boost::function<void (boost::weak_ptr<Event>)> Callback;
std::map<Event::Type, std::vector<Callback>> eventHandlerMap_;
};
나는 또한 부스트 :: 신호를 사용했지만, 그 또한 나에게 운영자 == 관련 컴파일 문제가 있습니다 : •
는 '=='진 : 어떤 운영자가 발견되지 왼쪽 소요 'CONST은 Functor'유형의 - 손 피연산자
void test(int c) {
std::cout << "test(" << c << ")";
}
struct Functor
{
void operator()(int g) {
std::cout << "Functor::operator(" << g << ")";
}
};
int main()
{
boost::signal<void (int)> sig;
Functor f;
sig.connect(test);
sig.connect(f);
sig(7);
sig.disconnect(f); // Error
}
내가 이것을 구현하는 방법에 대한 다른 제안을 (또는 허용 변환 없음)? 아니면 boost :: function 또는 boost :: signal work를 어떻게 만들 수 있을까요? (I 신호 오히려 항목의 작은 컬렉션 둔화되는 들었어요 때문에 차라리,하지만 부스트 :: 기능을 사용하십시오.)
편집 : 이것은 개의 EventManager 싶습니다 그 인터페이스가입니다 가지고있다.
class EventManager
{
public:
void addEventHandler(Event::Type evType, Callback func);
void removeEventHandler(Event::Type evType, Callback func);
void queueEvent(boost::shared_ptr<Event> ev);
void dispatchNextEvent();
};
@bdonlan 신호 예제 중 하나는 [boost :: function_equal] (http://www.boost.org/doc/libs/1_47_0/doc/html/boost/function_equal.html)입니다. –
sorta dup : http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects – stijn