fork download
  1. #include <iostream>
  2. #include <utility>
  3. #include <type_traits>
  4. using namespace std;
  5.  
  6. int LastError() { return 0; }
  7.  
  8. struct Error {
  9. Error(int err, const char*, int) {}
  10. };
  11.  
  12. template<typename R, typename... Args>
  13. inline typename enable_if<!is_void<R>::value, R>::type
  14. Check(R (&call)(Args...), Args... args)
  15. {
  16. R ret = call(args...);
  17. int err = LastError();
  18. if (err != 0) throw Error(err, __FILE__, __LINE__);
  19. return ret;
  20. }
  21.  
  22. template<typename... Args>
  23. inline void Check(void (&call)(Args...), Args... args)
  24. {
  25. call(args...);
  26. int err = LastError();
  27. if (err != 0) throw Error(err, __FILE__, __LINE__);
  28. }
  29.  
  30. void ExternalFct1(int, int, int)
  31. {
  32. cout << "ExternalFct1" << endl;
  33. }
  34.  
  35. int ExternalFct2(int, int, int)
  36. {
  37. cout << "ExternalFct2" << endl;
  38. return 0;
  39. }
  40.  
  41. int main()
  42. {
  43. Check(ExternalFct1, 1, 2, 3);
  44. return Check(ExternalFct2, 1, 2, 3);
  45. }
Success #stdin #stdout 0.01s 5544KB
stdin
Standard input is empty
stdout
ExternalFct1
ExternalFct2