#include <vector>
#include <iostream>
template<typename Delegates, typename Function, typename... Args>
void callOnAll(Delegates delegates, Function f, Args... args) {
for (int i = 0; i < delegates.size(); i++)
f(delegates[i], args...);
}
struct Delegate {
int x;
Delegate(int x) : x(x) {}
void doSomething(int foo) {
std::cout << "doSomething(" << foo << ") on Delegate(" << x << ")" << std::endl;
}
};
int main()
{
std::vector<Delegate*> delegates;
delegates.push_back(new Delegate(1));
delegates.push_back(new Delegate(2));
delegates.push_back(new Delegate(3));
callOnAll(delegates, std::mem_fun<void,Delegate>(&Delegate::doSomething), 42);
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgRGVsZWdhdGVzLCB0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUuLi4gQXJncz4Kdm9pZCBjYWxsT25BbGwoRGVsZWdhdGVzIGRlbGVnYXRlcywgRnVuY3Rpb24gZiwgQXJncy4uLiBhcmdzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5zaXplKCk7IGkrKykKICAgICAgICBmKGRlbGVnYXRlc1tpXSwgYXJncy4uLik7Cn0KCnN0cnVjdCBEZWxlZ2F0ZSB7CiAgICBpbnQgeDsKICAgIERlbGVnYXRlKGludCB4KSA6IHgoeCkge30KICAgIHZvaWQgZG9Tb21ldGhpbmcoaW50IGZvbykgewogICAgICAgIHN0ZDo6Y291dCA8PCAiZG9Tb21ldGhpbmcoIiA8PCBmb28gPDwgIikgb24gRGVsZWdhdGUoIiA8PCB4IDw8ICIpIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPERlbGVnYXRlKj4gZGVsZWdhdGVzOwogICAgZGVsZWdhdGVzLnB1c2hfYmFjayhuZXcgRGVsZWdhdGUoMSkpOwogICAgZGVsZWdhdGVzLnB1c2hfYmFjayhuZXcgRGVsZWdhdGUoMikpOwogICAgZGVsZWdhdGVzLnB1c2hfYmFjayhuZXcgRGVsZWdhdGUoMykpOwogICAgY2FsbE9uQWxsKGRlbGVnYXRlcywgc3RkOjptZW1fZnVuPHZvaWQsRGVsZWdhdGU+KCZEZWxlZ2F0ZTo6ZG9Tb21ldGhpbmcpLCA0Mik7Cn0=