#include <iostream>
#include <list>
#include <algorithm>
#include <string>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

using namespace std;
using namespace boost::lambda;

class Hond {
private:
	string n;
public:
	virtual ~Hond() {
	}
	string naam() const {
		return n;
	}
	void geefNaam(const string& s) {
		 n=s;
	}
	virtual string blaf() const =0;
};

class Tekkel: public Hond {
public:
	virtual string blaf() const {
		return "Kef kef ";
	}
};

class StBernard: public Hond {
public:
	virtual string blaf() const {
		return "Woef woef ";
	}
};

// handige template:
template<typename Container, typename Functor> void for_all(Container& c, Functor f) {
	for_each(c.begin(), c.end(), f);
}

int main() {
	list<Hond*> kennel;
	kennel.push_back(new Tekkel);
	kennel.push_back(new StBernard);
	kennel.push_back(new Tekkel);
//  blaffen zonder naam
	for_all(kennel, cout<<bind(&Hond::blaf, _1));
	cout<<endl;
//  alle honden heten "Fikkie"
	for_all(kennel, bind(&Hond::geefNaam, _1, "Fikkie"));
//  blaffen met naam
	for_all(kennel, cout<<bind(&Hond::naam, _1)<<":"<<bind(&Hond::blaf, _1));
	cout<<endl;
	cin.get();
	return 0;
}

