#include <iostream>
#include <string>
#include <map>
// the functions we intend to map
void disp1( )
{
std:: cout << "Disp1\n " ;
}
void disp2( )
{
std:: cout << "Disp2\n " ;
}
void disp3( )
{
std:: cout << "Disp3\n " ;
}
int main( ) {
// create a new type, func_t, which describes a pointer
// to a void function that takes no parameters (void).
using func_t = void ( * ) ( void ) ;
// declare a map from a string key to a func_t value,
// and initialize it with a mapping of f1->disp1, f2->disp2
// and f3->disp3
std:: map < std:: string , func_t> functionMap = {
{ "f1" , disp1 } , { "f2" , disp2 } , { "f3" , disp3 }
} ;
// declare a string for reading input
std:: string input;
// loop until there is no more input on std::cin.
while ( std:: cin .good ( ) ) {
// prompt
std:: cout << "Which disp (f1, f2, f3)? " ;
// fetch the next line of text from cin, without the \n
std:: getline ( std:: cin , input) ;
// if the input is empty we ran out of input or the user
// input a blank line. either way, stop.
if ( input.empty ( ) )
break ;
std:: cout << "You chose " << input << "\n " ;
// look for the key in the map. if the key is not found,
// it will equal the special iterator functionMap.end()
auto it = functionMap.find ( input) ;
// If it's not functionMap.end then we have a valid iterator.
// it->first is the key, it->second is the function pointer.
if ( it ! = functionMap.end ( ) ) {
// to use a function pointer, just add the () with any
// arguments after the variable name.
// remember, it->second is the function pointer.
it- > second( ) ;
} else {
std:: cout << "Invalid entry.\n " ;
}
}
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDxzdHJpbmc+CgkjaW5jbHVkZSA8bWFwPgoJCgkvLyB0aGUgZnVuY3Rpb25zIHdlIGludGVuZCB0byBtYXAKCXZvaWQgZGlzcDEoKQoJewoJICBzdGQ6OmNvdXQ8PCJEaXNwMVxuIjsKCX0KCQoJdm9pZCBkaXNwMigpCgl7CgkgIHN0ZDo6Y291dDw8IkRpc3AyXG4iOwoJfQoJCgl2b2lkIGRpc3AzKCkKCXsKCSAgc3RkOjpjb3V0PDwiRGlzcDNcbiI7Cgl9CgkKCWludCBtYWluKCkgewoJCS8vIGNyZWF0ZSBhIG5ldyB0eXBlLCBmdW5jX3QsIHdoaWNoIGRlc2NyaWJlcyBhIHBvaW50ZXIKCQkvLyB0byBhIHZvaWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBwYXJhbWV0ZXJzICh2b2lkKS4KCQl1c2luZyBmdW5jX3QgPSB2b2lkICgqKSh2b2lkKTsKCQkvLyBkZWNsYXJlIGEgbWFwIGZyb20gYSBzdHJpbmcga2V5IHRvIGEgZnVuY190IHZhbHVlLAoJCS8vIGFuZCBpbml0aWFsaXplIGl0IHdpdGggYSBtYXBwaW5nIG9mIGYxLT5kaXNwMSwgZjItPmRpc3AyCgkJLy8gYW5kIGYzLT5kaXNwMwoJCXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBmdW5jX3Q+IGZ1bmN0aW9uTWFwID0gewoJCQl7ICJmMSIsIGRpc3AxIH0sIHsgImYyIiwgZGlzcDIgfSwgeyAiZjMiLCBkaXNwMyB9CgkJfTsKCQkKCQkvLyBkZWNsYXJlIGEgc3RyaW5nIGZvciByZWFkaW5nIGlucHV0CgkJc3RkOjpzdHJpbmcgaW5wdXQ7CgkJCgkJLy8gbG9vcCB1bnRpbCB0aGVyZSBpcyBubyBtb3JlIGlucHV0IG9uIHN0ZDo6Y2luLgoJCXdoaWxlIChzdGQ6OmNpbi5nb29kKCkpIHsKCQkJLy8gcHJvbXB0CgkJCXN0ZDo6Y291dCA8PCAiV2hpY2ggZGlzcCAoZjEsIGYyLCBmMyk/ICI7CgkJCS8vIGZldGNoIHRoZSBuZXh0IGxpbmUgb2YgdGV4dCBmcm9tIGNpbiwgd2l0aG91dCB0aGUgXG4KCQkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBpbnB1dCk7CgkJCS8vIGlmIHRoZSBpbnB1dCBpcyBlbXB0eSB3ZSByYW4gb3V0IG9mIGlucHV0IG9yIHRoZSB1c2VyCgkJCS8vIGlucHV0IGEgYmxhbmsgbGluZS4gZWl0aGVyIHdheSwgc3RvcC4KCQkJaWYgKGlucHV0LmVtcHR5KCkpCgkJCQlicmVhazsKCQkJCQoJCQlzdGQ6OmNvdXQgPDwgIllvdSBjaG9zZSAiIDw8IGlucHV0IDw8ICJcbiI7CgkJCQoJCQkvLyBsb29rIGZvciB0aGUga2V5IGluIHRoZSBtYXAuIGlmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAoJCQkvLyBpdCB3aWxsIGVxdWFsIHRoZSBzcGVjaWFsIGl0ZXJhdG9yIGZ1bmN0aW9uTWFwLmVuZCgpCgkJCWF1dG8gaXQgPSBmdW5jdGlvbk1hcC5maW5kKGlucHV0KTsKCQkJLy8gSWYgaXQncyBub3QgZnVuY3Rpb25NYXAuZW5kIHRoZW4gd2UgaGF2ZSBhIHZhbGlkIGl0ZXJhdG9yLgoJCQkvLyBpdC0+Zmlyc3QgaXMgdGhlIGtleSwgaXQtPnNlY29uZCBpcyB0aGUgZnVuY3Rpb24gcG9pbnRlci4KCQkJaWYgKGl0ICE9IGZ1bmN0aW9uTWFwLmVuZCgpKSB7CgkJCQkvLyB0byB1c2UgYSBmdW5jdGlvbiBwb2ludGVyLCBqdXN0IGFkZCB0aGUgKCkgd2l0aCBhbnkKCQkJCS8vIGFyZ3VtZW50cyBhZnRlciB0aGUgdmFyaWFibGUgbmFtZS4KCQkJCS8vIHJlbWVtYmVyLCBpdC0+c2Vjb25kIGlzIHRoZSBmdW5jdGlvbiBwb2ludGVyLgoJCQkJaXQtPnNlY29uZCgpOwoJCQl9IGVsc2UgewoJCQkJc3RkOjpjb3V0IDw8ICJJbnZhbGlkIGVudHJ5LlxuIjsKCQkJfQoJCX0KCX0=
stdout
Which disp (f1, f2, f3)? You chose f1
Disp1
Which disp (f1, f2, f3)? You chose f3
Disp3
Which disp (f1, f2, f3)? You chose f2
Disp2
Which disp (f1, f2, f3)?