2010-02-09 3 views
3

Я пытаюсь создать делегаты и события многоадресной передачи в C#, используя функции из TR1. Или Boost, поскольку boost :: function (в основном) такая же, как и std :: tr1 :: function. В качестве доказательства концепции я пробовал это:Создание событий многоадресной передачи с помощью std :: tr1 :: function (или boost :: function)

template<typename T1> 
class Event 
{ 
private: 
typedef std::tr1::function<void (T1)> action; 
std::list<action> callbacks; 

public: 

inline void operator += (action func) 
{ 
    callbacks.push_back(func); 
} 

inline void operator -= (action func) 
{ 
    callbacks.remove(func); 
} 

void operator()(T1 arg1) 
{ 
    for(std::list<action>::iterator iter = callbacks.begin(); 
    iter != callbacks.end(); iter++) 
    { 
    (*iter)(arg1); 
    } 
} 
}; 

Какие работы, вроде. В строке callbacks.remove(func) нет. Когда я компилирую, я получаю следующее сообщение об ошибке:

error C2451: conditional expression of type 'void' is illegal 

который обусловлен линией 1194 list заголовка, который находится в функции remove. Чем это вызвано?

ответ

3

Я думаю, что это точно такая же проблема: comparing-stdtr1function-objects

(в основном вы не можете сравнивать функторы, поэтому стирать или что-либо с помощью оператора == не будет работать)

5

Если вы ищете делегатов многоадресной передачи в C++, лучшим вариантом будет Boost.Signals2. Вы также можете использовать Boost.Bind, чтобы использовать функции-члены для обратных вызовов.

Вы можете посмотреть мой пример here для простого использования Boost.Signals и Boost.Bind.

Boost.Signal предоставляет средства управления жизненным циклом, чтобы гарантировать, что события не будут опубликованы подписчикам, которые больше не существуют.

+0

Ах, спасибо. Должен был знать, что Boost уже предлагает это. –