#define _SCL_SECURE_NO_WARNINGS
#include<iostream>
#include<boost\signals2.hpp>
#include<boost\random.hpp>
#include<boost\bind.hpp>
typedef boost::variate_generator<boost::rand48, boost::uniform_int<>> bool_rand;
bool_rand g_rand(boost::rand48(time(0)), boost::uniform_int<>(0, 100));
//门铃类
class Ring
{
public:
typedef boost::signals2::signal<void()> signal_t;
typedef signal_t::slot_type slot_t;
boost::signals2::connection Connect(const slot_t &s)
{
return alarm.connect(s);
}
void Press()
{
std::cout << "Ring alarms..." << std::endl;
alarm();
}
private:
signal_t alarm;
};
//护士类
extern char const nurse1[] = "nurse1-Mary";
extern char const nurse2[] = "nurse2-Kate";
template<char const* name>
class Nurse
{
private:
bool_rand &rand;
public:
Nurse():rand(g_rand){
}
void Action()
{
std::cout << name;
if (rand() > 30)
{
std::cout << " wakeup and open door" << std::endl;
}
else
{
std::cout << " is sleeping..." << std::endl;
}
}
};
//儿童类
extern char const baby1[] = "baby1-Tom";
extern char const baby2[] = "baby2-Jerry";
template<char const* name>
class Baby
{
private:
bool_rand &rand;
public:
Baby() :rand(g_rand) {
}
void Action()
{
std::cout << name;
if (rand() > 50)
{
std::cout << " wakeup and crying loudly" << std::endl;
}
else
{
std::cout << " is sleeping sweetly..." << std::endl;
}
}
};
//访客类
class Quest
{
public:
void Press(Ring &r)
{
std::cout << "A quest presses the ring.... " << std::endl;
r.Press();
}
};
int main(int argc, char** argv)
{
Ring r;
Nurse<nurse1> n1;
Nurse<nurse2> n2;
Baby<baby1> b1;
Baby<baby2> b2;
Quest g;
r.Connect(boost::bind(&Nurse<nurse1>::Action,n1));
r.Connect(boost::bind(&Nurse<nurse2>::Action, n2));
r.Connect(boost::bind(&Baby<baby1>::Action, b1));
r.Connect(boost::bind(&Baby<baby2>::Action, b2));
g.Press(r);
return 0;
}