#include <iostream>
#include <functional>
using namespace std;
template <class TR = void, class ... Types>
struct GenericFunc
#ifndef SWIG
: std::function<TR (Types...)>
#endif
{
GenericFunc() {}
#ifndef SWIG
GenericFunc(const std::function<TR (Types... t)> & Action) : std::function<TR (Types... t)>(Action) {}
#endif
virtual TR OnAction(Types ... result) {
if(*this) {
return (*this)(result...);
}
}
virtual ~GenericFunc(){}
};
template<class... Types>
using GenericAction = GenericFunc<void, Types...>;
typedef GenericAction<int> iAction;
int main() {
iAction ia;
iAction ia2([&](int i) {std::cout << i << endl;});
ia.OnAction(1);
ia2.OnAction(2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDxjbGFzcyBUUiA9IHZvaWQsIGNsYXNzIC4uLiBUeXBlcz4Kc3RydWN0IEdlbmVyaWNGdW5jIAojaWZuZGVmIFNXSUcKCTogc3RkOjpmdW5jdGlvbjxUUiAoVHlwZXMuLi4pPgojZW5kaWYKewoJR2VuZXJpY0Z1bmMoKSB7fQoKI2lmbmRlZiBTV0lHCglHZW5lcmljRnVuYyhjb25zdCBzdGQ6OmZ1bmN0aW9uPFRSIChUeXBlcy4uLiB0KT4gJiBBY3Rpb24pIDogc3RkOjpmdW5jdGlvbjxUUiAoVHlwZXMuLi4gdCk+KEFjdGlvbikge30KI2VuZGlmCgl2aXJ0dWFsIFRSIE9uQWN0aW9uKFR5cGVzIC4uLiByZXN1bHQpIHsKCQlpZigqdGhpcykgewoJCQlyZXR1cm4gKCp0aGlzKShyZXN1bHQuLi4pOwoJCX0KCX0KCXZpcnR1YWwgfkdlbmVyaWNGdW5jKCl7fQp9OwoKdGVtcGxhdGU8Y2xhc3MuLi4gVHlwZXM+CnVzaW5nIEdlbmVyaWNBY3Rpb24gPSBHZW5lcmljRnVuYzx2b2lkLCBUeXBlcy4uLj47Cgp0eXBlZGVmIEdlbmVyaWNBY3Rpb248aW50PiBpQWN0aW9uOwoKaW50IG1haW4oKSB7CglpQWN0aW9uIGlhOwoJaUFjdGlvbiBpYTIoWyZdKGludCBpKSB7c3RkOjpjb3V0IDw8IGkgPDwgZW5kbDt9KTsKCWlhLk9uQWN0aW9uKDEpOwoJaWEyLk9uQWN0aW9uKDIpOwoJcmV0dXJuIDA7Cn0=