#include <iostream>
#include <functional>

class A {
	public:
		void foo (int x) { std::cout << "A::foo(" << x << ")\n"; }
};

class B {
	public:
		void foo (int x) { std::cout << "B::foo(" << x << ")\n"; }
};

// Variante 1: std::bind
void test1 () {
	// Instanzen der Klassen
	A a;
	B b;
	
	// "Polymorpher" Funktionspointer
	std::function<void(int)> fun;
	
	// Weise A::foo zu, mit Instanz a
	fun = std::bind (&A::foo, &a, std::placeholders::_1);
	
	// Rufe auf
	fun (42);
	
	// Weise B::foo zu, mit Instanz b
	fun = std::bind (&B::foo, &b, std::placeholders::_1);
	
	// Rufe auf
	fun (84);
}

// Variante 2: Lambda
void test2 () {
	// Instanzen der Klassen
	A a;
	B b;
	
	// "Polymorpher" Funktionspointer
	std::function<void(int)> fun;
	
	// Weise A::foo zu, mit Instanz a
	fun = [&a] (int x) { a.foo (x); };
	
	// Rufe auf
	fun (42);
	
	// Weise B::foo zu, mit Instanz b
	fun = [&b] (int x) { b.foo (x); };
	
	// Rufe auf
	fun (84);
}

int main() {
	test1 ();
	test2 ();
	return 0;
}