#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnZvaWQgc29tZUZ1bmN0aW9uICgpIHsKCXN0ZDo6Y291dCA8PCAic29tZUZ1bmN0aW9uXG4iOwp9CgpjbGFzcyBGdW5jdGlvbmFsQ2xhc3MgewoJcHVibGljOgoJCUZ1bmN0aW9uYWxDbGFzcyAoaW50IHgpIDogbV94ICh4KSB7fQoJCXZvaWQgb3BlcmF0b3IgKCkgKCkgewoJCQlzdGQ6OmNvdXQgPDwgIkZ1bmN0aW9uYWxDbGFzcyB7IiA8PCBtX3ggPDwgIn0ub3BlcmF0b3IgKClcbiI7CgkJfQoJcHJpdmF0ZToKCQlpbnQgbV94Owp9OwoKY2xhc3MgU29tZUNsYXNzIHsKCXB1YmxpYzoKCQlTb21lQ2xhc3MgKGludCB4KSA6IG1feCAoeCkge30KCQl2b2lkIHNvbWVNZW1iZXJGdW5jdGlvbiAoKSB7CgkJCXN0ZDo6Y291dCA8PCAiU29tZUNsYXNzIHsiIDw8IG1feCA8PCAifS5zb21lTWVtYmVyRnVuY3Rpb25cbiI7CgkJfQoJcHJpdmF0ZToKCQlpbnQgbV94Owp9OwoKaW50IG1haW4oKSB7CglGdW5jdGlvbmFsQ2xhc3MgZiAoNDIpOwoJU29tZUNsYXNzIGMgKDEyMyk7CglpbnQgY2xvc3VyZWQgPSA0NTY7CgoJc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBmdW5BcnJheSB7CS8vIEFycmF5IG1pdCBzdGQ6OmZ1bmN0aW9uCgkKCQkmc29tZUZ1bmN0aW9uLAkJLy8gRnVua3Rpb25zcG9pbnRlciByZWlucGFja2VuCgkKCQlmLAkJCQkJLy8gRnVua3Rpb25hbCAoS2xhc3NlIG1pdCBvcGVyYXRvciAoKSkgcmVpbnBhY2tlbiAoa29waWVyZW4hKQoJCgkJc3RkOjpiaW5kKCZTb21lQ2xhc3M6OnNvbWVNZW1iZXJGdW5jdGlvbiwgYyksIC8vIE1lbWJlci1GdW5rdGlvbiBtaXQgenVnZWjDtnJpZ2VyIEluc3RhbnogcmVpbnBhY2tlbgoJCgkJWyZdKCkgewkJCQkvLyBMYW1iZGEgcmVpbnBhY2tlbgoJCQlzdGQ6OmNvdXQgPDwgImxhbWJkYSBjbG9zdXJlZD0iIDw8IGNsb3N1cmVkIDw8ICdcbic7CgkJfQoJfTsKCQoJZm9yIChhdXRvJiBmIDogZnVuQXJyYXkpIHsJCQkJLy8gQWxsZSByZWluZ2VwYWNrdGVuIEZ1bmt0aW9uZW4gYXVmcnVmZW4KCQlmICgpOwoJfQoJCglyZXR1cm4gMDsKfQ==