#include <iostream>
#include <functional>
using namespace std::placeholders;
class DelegateToFunctionEnd {
typedef std::function<void(void)> EndFunction;
public:
DelegateToFunctionEnd(EndFunction endFunction) :
callAtEnd(endFunction)
{ }
~DelegateToFunctionEnd() {
callAtEnd();
}
private:
EndFunction callAtEnd;
};
class Results {
public:
void setStatus(int i) {
status = i;
}
int status;
};
int function(Results &res) {
int error;
DelegateToFunctionEnd del(std::bind(&Results::setStatus, &res, std::cref(error)));
// Some operations
error = -10;
if (error < 0) {
return 0;
}
}
int main() {
Results r;
function(r);
std::cout << r.status;
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKCmNsYXNzIERlbGVnYXRlVG9GdW5jdGlvbkVuZCB7CgogICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IEVuZEZ1bmN0aW9uOyAKCiAgICBwdWJsaWM6IAogICAgRGVsZWdhdGVUb0Z1bmN0aW9uRW5kKEVuZEZ1bmN0aW9uIGVuZEZ1bmN0aW9uKSA6CiAgICAgICAgY2FsbEF0RW5kKGVuZEZ1bmN0aW9uKQogICAgeyB9CiAgICAKICAgIH5EZWxlZ2F0ZVRvRnVuY3Rpb25FbmQoKSB7CiAgICAJY2FsbEF0RW5kKCk7CiAgICB9CiAgICAKICAgIHByaXZhdGU6IAogICAgCiAgICBFbmRGdW5jdGlvbiBjYWxsQXRFbmQ7Cn07CgpjbGFzcyBSZXN1bHRzIHsKCQoJcHVibGljOgoJCgl2b2lkIHNldFN0YXR1cyhpbnQgaSkgewoJCXN0YXR1cyA9IGk7Cgl9CgkKCWludCBzdGF0dXM7Cn07CgoKaW50IGZ1bmN0aW9uKFJlc3VsdHMgJnJlcykgewoJaW50IGVycm9yOwoJRGVsZWdhdGVUb0Z1bmN0aW9uRW5kIGRlbChzdGQ6OmJpbmQoJlJlc3VsdHM6OnNldFN0YXR1cywgJnJlcywgc3RkOjpjcmVmKGVycm9yKSkpOwoJLy8gU29tZSBvcGVyYXRpb25zCiAgICAgICAgICAgIGVycm9yID0gLTEwOwoJaWYgKGVycm9yIDwgMCkgewoJCXJldHVybiAwOwoJfQoKfQoKaW50IG1haW4oKSB7CgkKCVJlc3VsdHMgcjsKCWZ1bmN0aW9uKHIpOwoJCglzdGQ6OmNvdXQgPDwgci5zdGF0dXM7CgkKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9