#include <string>
#include <iostream>
template < int attempts>
struct password_entry
{
static bool get_entry( std:: string & myusername, std:: string & mypassword)
{
std:: cout << "Enter your username: " ;
std:: cin >> myusername;
std:: cout << "Enter your password: " ;
std:: cin >> mypassword;
if ( myusername == "veasy62" && mypassword == "12" )
{
std:: cout << "Access granted veasy62" << std:: endl ;
return true ;
}
if ( attempts > 1 )
std:: cout << "Access denied. You have " << attempts - 1 << " attempts remaining\n " ;
return password_entry< attempts - 1 > :: get_entry ( myusername, mypassword) ;
}
} ;
template <>
struct password_entry< 0 >
{
static bool get_entry( const std:: string & /*myusername*/ , const std:: string & /*mypassword*/ )
{
std:: cout << "Sorry you have ran out of attempts\n " ;
return false ;
}
} ;
int main( )
{
std:: string mypass, myuser;
// max 2 attempts
bool access_granted = password_entry< 2 > :: get_entry ( myuser, mypass) ;
if ( access_granted )
std:: cout << "Welcome current user" ;
else
std:: cout << "Please call 555-5555 to reset your password" ;
}
ICAgICNpbmNsdWRlIDxzdHJpbmc+CiAgICAjaW5jbHVkZSA8aW9zdHJlYW0+CiAgICAKICAgIHRlbXBsYXRlIDxpbnQgYXR0ZW1wdHM+CiAgICBzdHJ1Y3QgcGFzc3dvcmRfZW50cnkKICAgIHsKICAgIAlzdGF0aWMgYm9vbCBnZXRfZW50cnkoc3RkOjpzdHJpbmcmIG15dXNlcm5hbWUsIHN0ZDo6c3RyaW5nJiBteXBhc3N3b3JkKQogICAgCXsKICAgIAkJc3RkOjpjb3V0IDw8ICJFbnRlciB5b3VyIHVzZXJuYW1lOiAiOwogICAgCQlzdGQ6OmNpbiA+PiBteXVzZXJuYW1lOwogICAgCQlzdGQ6OmNvdXQgPDwgIkVudGVyIHlvdXIgcGFzc3dvcmQ6ICI7CiAgICAJCXN0ZDo6Y2luID4+IG15cGFzc3dvcmQ7CiAgICAJCWlmIChteXVzZXJuYW1lID09ICJ2ZWFzeTYyIiAmJiBteXBhc3N3b3JkID09ICIxMiIpCiAgICAJCXsKICAgIAkJCXN0ZDo6Y291dCA8PCAiQWNjZXNzIGdyYW50ZWQgdmVhc3k2MiIgPDwgc3RkOjplbmRsOwogICAgCQkJcmV0dXJuIHRydWU7CiAgICAJCX0KICAgIAkJaWYgKCBhdHRlbXB0cyA+IDEgKQogICAgCQkJc3RkOjpjb3V0IDw8ICJBY2Nlc3MgZGVuaWVkLiAgWW91IGhhdmUgIiA8PCBhdHRlbXB0cyAtIDEgPDwgIiBhdHRlbXB0cyByZW1haW5pbmdcbiI7CiAgICAJCXJldHVybiBwYXNzd29yZF9lbnRyeTxhdHRlbXB0cyAtIDE+OjpnZXRfZW50cnkobXl1c2VybmFtZSwgbXlwYXNzd29yZCk7CiAgICAJfQogICAgfTsKICAgIAogICAgdGVtcGxhdGUgPD4gCiAgICBzdHJ1Y3QgcGFzc3dvcmRfZW50cnk8MD4KICAgIHsKICAgIAlzdGF0aWMgYm9vbCBnZXRfZW50cnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qbXl1c2VybmFtZSovLCBjb25zdCBzdGQ6OnN0cmluZyYgLypteXBhc3N3b3JkKi8pCiAgICAJewogICAgCQlzdGQ6OmNvdXQgPDwgIlNvcnJ5IHlvdSBoYXZlIHJhbiBvdXQgb2YgYXR0ZW1wdHNcbiI7CiAgICAJCXJldHVybiBmYWxzZTsKICAgIAl9CiAgICB9OwoKICAgIAogICAgaW50IG1haW4oKQogICAgewogICAgCXN0ZDo6c3RyaW5nIG15cGFzcywgbXl1c2VyOwoKICAgICAgICAvLyBtYXggMiBhdHRlbXB0cyAKICAgIAlib29sIGFjY2Vzc19ncmFudGVkID0gcGFzc3dvcmRfZW50cnk8Mj46OmdldF9lbnRyeShteXVzZXIsIG15cGFzcyk7CiAgICAJaWYgKCBhY2Nlc3NfZ3JhbnRlZCApCgkgICAgICAgc3RkOjpjb3V0IDw8ICJXZWxjb21lIGN1cnJlbnQgdXNlciI7CgkgICAgZWxzZQoJICAgICAgIHN0ZDo6Y291dCA8PCAiUGxlYXNlIGNhbGwgNTU1LTU1NTUgdG8gcmVzZXQgeW91ciBwYXNzd29yZCI7CiAgICB9Cgo=