#include <iostream>
#include <functional>
#include <vector>

void someFunction () {
	std::cout << "someFunction\n";
}

class FunctionalClass {
	public:
		FunctionalClass (int x) : m_x (x) {}
		void operator () () {
			std::cout << "FunctionalClass {" << m_x << "}.operator ()\n";
		}
	private:
		int m_x;
};

class SomeClass {
	public:
		SomeClass (int x) : m_x (x) {}
		void someMemberFunction () {
			std::cout << "SomeClass {" << m_x << "}.someMemberFunction\n";
		}
	private:
		int m_x;
};

int main() {
	FunctionalClass f (42);
	SomeClass c (123);
	int closured = 456;

	std::vector<std::function<void()>> funArray {	// Array mit std::function
	
		&someFunction,		// Funktionspointer reinpacken
	
		f,					// Funktional (Klasse mit operator ()) reinpacken (kopieren!)
	
		std::bind(&SomeClass::someMemberFunction, c), // Member-Funktion mit zugehöriger Instanz reinpacken
	
		[&]() {				// Lambda reinpacken
			std::cout << "lambda closured=" << closured << '\n';
		}
	};
	
	for (auto& f : funArray) {				// Alle reingepackten Funktionen aufrufen
		f ();
	}
	
	return 0;
}