Como usar Boost Signals
Essa biblioteca é bem interessante para quem deseja replicar o sistema de Signals/Slots de Componentes Visuais similar ao QT Framework.
Mas como funciona essa biblioteca?
Basicamente o objetivo dessa biblioteca é para criar sinais de eventos e slots de escuta com execução síncrona, ou seja, uma simulação de múltiplos callbacks para um determinado sinal, evento ou função.
Obs. Um sinal pode enviar eventos para vários slots e um slot pode ser invocados por vários sinais.
Por exemplo, quando alguém clicar no botão “buscar” quero avisar a janela e as lista de resultado que teve essa ação de clique, como explicado no desenho abaixo:

Como que ficaria esse programa usando Signals/Slots?
#include "stdafx.h"
#include <string>
#include <iostream>
#include <boost\signals2.hpp>
#include <boost\bind.hpp>
using namespace boost::signals2;
class Button {
public:
Button() {}
~Button() {}
public:
static signal<void()> _click;
void click(){
std::cout << "before click" << std::endl;
_click();
std::cout << "after click" << std::endl;
}
};
signal<void()> Button::_click;
class Window {
public:
Window() {
Button::_click.connect(boost::bind(&Window::refresh, this ));
}
~Window() {}
public:
void refresh() {
std::cout << "refresh window" << std::endl;
}
};
class Input {
public:
Input(){}
~Input(){}
};
class List {
public:
List(){
Button::_click.connect(boost::bind(&List::refresh, this ));
}
~List(){}
public:
void refresh() {
std::cout << "refresh list" << std::endl;
}
};
int main(){
Window w;
List l;
Button b;
b.click();
int pause;
std::cin << pause;
return 0;
}
O resultado dessa execução é:
before click
refresh window
refresh list
after click
Lógico que a maneira que fiz não é da melhor forma, é somente um caso de estudo.
Estou fazendo alguns exemplo no GitHub, caso queira testar é necessário ter o Visual Studio 2015 e configurar a variável de ambiente BOOST com o diretório aonde está os arquivos de cabeçalho e bibliotecas compiladas no Windows.
Como devo usar o signal e o slot?
Explicação da variável do tipo signal:
Como atribuir um slot a um sinal:
A ordem de execução será conforme a atribuição via função “connect”.
Caso tenha alguma dúvida deixe nos comentários!