#include <iostream>
#include <boost/bind.hpp>
using namespace std;
template<class function_type>
void retry(function_type function)
{
const int numOfRetries = 3;
int i = 1;
do
{
//Invoke the function that was passed as argument
if(function())
{
//Invocation is successful
cout << "\t try number#" << i <<" Successful \n";
break;
}
//Invocation is Not successful
cout << "\t try number#" << i <<" Not Successful \n";
++i;
if (i == 4)
{
cout<< "\t failed invocation!";
}
}while (i <= numOfRetries);
}
int Permit(int i)
{
//Permit succeeds the second retry
static int x = 0;
x++;
if (x == 2 && i ==1 ) return 1;
else return 0;
}
int main()
{
int i = 1;
retry(boost::bind(Permit, i));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTxjbGFzcyBmdW5jdGlvbl90eXBlPgp2b2lkIHJldHJ5KGZ1bmN0aW9uX3R5cGUgZnVuY3Rpb24pCnsKICAgIGNvbnN0IGludCBudW1PZlJldHJpZXMgPSAzOwogICAgaW50IGkgPSAxOwogICAgZG8KICAgIHsKICAgICAgICAvL0ludm9rZSB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgcGFzc2VkIGFzIGFyZ3VtZW50CiAgICAgICAgaWYoZnVuY3Rpb24oKSkKICAgICAgICB7CiAgICAgICAgICAvL0ludm9jYXRpb24gaXMgc3VjY2Vzc2Z1bAogICAgICAgICAgY291dCA8PCAiXHQgdHJ5IG51bWJlciMiIDw8IGkgPDwiIFN1Y2Nlc3NmdWwgXG4iOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvL0ludm9jYXRpb24gaXMgTm90IHN1Y2Nlc3NmdWwKICAgICAgICBjb3V0IDw8ICJcdCB0cnkgbnVtYmVyIyIgPDwgaSA8PCIgTm90IFN1Y2Nlc3NmdWwgXG4iOwogICAgICAgICsraTsKCiAgICAgICAgaWYgKGkgPT0gNCkKICAgICAgICB7CiAgICAgICAgICBjb3V0PDwgIlx0IGZhaWxlZCBpbnZvY2F0aW9uISI7CiAgICAgICAgfQoKICAgIH13aGlsZSAoaSA8PSBudW1PZlJldHJpZXMpOwp9CgppbnQgUGVybWl0KGludCBpKQp7CiAgICAvL1Blcm1pdCBzdWNjZWVkcyB0aGUgc2Vjb25kIHJldHJ5CiAgICBzdGF0aWMgaW50IHggPSAwOwogICAgeCsrOwogICAgaWYgKHggPT0gMiAmJiBpID09MSApIHJldHVybiAxOwogICAgZWxzZSByZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgaSA9IDE7CiAgICByZXRyeShib29zdDo6YmluZChQZXJtaXQsIGkpKTsKfQ==