#include <iostream>
#include <functional>
#include <vector>
using namespace std;
template<typename... TArgs>
class Delegate;
template<typename... TArgs>
class Delegate<void, TArgs...>
{
private:
typedef std::function<void(TArgs...)> Func;
std::vector<Func> funcs;
public:
template<typename T> Delegate& operator+=(T mFunc) { funcs.push_back(Func(mFunc)); return *this; }
void operator()(TArgs... mParams) { /*for (auto& f : funcs) f(mParams...);* gcc 4.5 does not support ranged based for*/ }
};
void test(int x, int y) { x - y; }
int main()
{
Delegate<void, int, int> d2;
d2 += test;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUQXJncz4KICAgIGNsYXNzIERlbGVnYXRlOwp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUQXJncz4KICAgIGNsYXNzIERlbGVnYXRlPHZvaWQsIFRBcmdzLi4uPgogICAgewogICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFRBcmdzLi4uKT4gRnVuYzsKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RnVuYz4gZnVuY3M7CgogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gRGVsZWdhdGUmIG9wZXJhdG9yKz0oVCBtRnVuYykgeyBmdW5jcy5wdXNoX2JhY2soRnVuYyhtRnVuYykpOyByZXR1cm4gKnRoaXM7IH0KICAgICAgICAgICAgdm9pZCBvcGVyYXRvcigpKFRBcmdzLi4uIG1QYXJhbXMpIHsgLypmb3IgKGF1dG8mIGYgOiBmdW5jcykgZihtUGFyYW1zLi4uKTsqIGdjYyA0LjUgZG9lcyBub3Qgc3VwcG9ydCByYW5nZWQgYmFzZWQgZm9yKi8gfQogICAgfTsKCiAgICB2b2lkIHRlc3QoaW50IHgsIGludCB5KSB7IHggLSB5OyB9CmludCBtYWluKCkKewpEZWxlZ2F0ZTx2b2lkLCBpbnQsIGludD4gZDI7CmQyICs9IHRlc3Q7Cn0=