#include <iostream>
#include <utility>
#include <type_traits>
using namespace std;
int LastError() { return 0; }
struct Error {
Error(int err, const char*, int) {}
};
template<typename R, typename... Args>
inline typename enable_if<!is_void<R>::value, R>::type
Check(R (&call)(Args...), Args... args)
{
R ret = call(args...);
int err = LastError();
if (err != 0) throw Error(err, __FILE__, __LINE__);
return ret;
}
template<typename... Args>
inline void Check(void (&call)(Args...), Args... args)
{
call(args...);
int err = LastError();
if (err != 0) throw Error(err, __FILE__, __LINE__);
}
void ExternalFct1(int, int, int)
{
cout << "ExternalFct1" << endl;
}
int ExternalFct2(int, int, int)
{
cout << "ExternalFct2" << endl;
return 0;
}
int main()
{
Check(ExternalFct1, 1, 2, 3);
return Check(ExternalFct2, 1, 2, 3);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IExhc3RFcnJvcigpIHsgcmV0dXJuIDA7IH0KCnN0cnVjdCBFcnJvciB7CglFcnJvcihpbnQgZXJyLCBjb25zdCBjaGFyKiwgaW50KSB7fQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4KaW5saW5lIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfdm9pZDxSPjo6dmFsdWUsIFI+Ojp0eXBlCkNoZWNrKFIgKCZjYWxsKShBcmdzLi4uKSwgQXJncy4uLiBhcmdzKQp7CiAgICBSIHJldCA9IGNhbGwoYXJncy4uLik7CiAgICBpbnQgZXJyID0gTGFzdEVycm9yKCk7CiAgICBpZiAoZXJyICE9IDApIHRocm93IEVycm9yKGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKICAgIHJldHVybiByZXQ7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CmlubGluZSB2b2lkIENoZWNrKHZvaWQgKCZjYWxsKShBcmdzLi4uKSwgQXJncy4uLiBhcmdzKQp7CiAgICBjYWxsKGFyZ3MuLi4pOwogICAgaW50IGVyciA9IExhc3RFcnJvcigpOwogICAgaWYgKGVyciAhPSAwKSB0aHJvdyBFcnJvcihlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Cn0KCnZvaWQgRXh0ZXJuYWxGY3QxKGludCwgaW50LCBpbnQpCnsKCWNvdXQgPDwgIkV4dGVybmFsRmN0MSIgPDwgZW5kbDsKfQoKaW50IEV4dGVybmFsRmN0MihpbnQsIGludCwgaW50KQp7Cgljb3V0IDw8ICJFeHRlcm5hbEZjdDIiIDw8IGVuZGw7CglyZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CglDaGVjayhFeHRlcm5hbEZjdDEsIDEsIDIsIDMpOwoJcmV0dXJuIENoZWNrKEV4dGVybmFsRmN0MiwgMSwgMiwgMyk7Cn0=