#include <iostream>
#include <string>
#include <map>
typedef void(*FUNCPTR)(double*, int); // our typedef
std::map<std::string, FUNCPTR> func_map;
// some functions
void f1(double*, int) {std::cout << "f1" << std::endl;}
void f2(double*, int) {std::cout << "f2" << std::endl;}
// call them via an invoking function
void myMainFit(const std::string& which, double* ptr, int val)
{
if (func_map.find(which) != func_map.end()) // indeed the function was added
func_map[which](ptr, val);
else
{
std::cerr << "Function \"" << which << "\" is not in the map!\n";
return; // or throw
}
}
int main()
{
// add functions to the map
func_map["first"] = &f1;
func_map["second"] = &f2;
myMainFit("first", nullptr, 42);
myMainFit("second", nullptr, 20);
myMainFit("inexistent", nullptr, 10);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgoKdHlwZWRlZiB2b2lkKCpGVU5DUFRSKShkb3VibGUqLCBpbnQpOyAvLyBvdXIgdHlwZWRlZgpzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRlVOQ1BUUj4gZnVuY19tYXA7CgovLyBzb21lIGZ1bmN0aW9ucwp2b2lkIGYxKGRvdWJsZSosIGludCkge3N0ZDo6Y291dCA8PCAiZjEiIDw8IHN0ZDo6ZW5kbDt9CnZvaWQgZjIoZG91YmxlKiwgaW50KSB7c3RkOjpjb3V0IDw8ICJmMiIgPDwgc3RkOjplbmRsO30KCi8vIGNhbGwgdGhlbSB2aWEgYW4gaW52b2tpbmcgZnVuY3Rpb24Kdm9pZCBteU1haW5GaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHdoaWNoLCBkb3VibGUqIHB0ciwgaW50IHZhbCkKewogICAgaWYgKGZ1bmNfbWFwLmZpbmQod2hpY2gpICE9IGZ1bmNfbWFwLmVuZCgpKSAvLyBpbmRlZWQgdGhlIGZ1bmN0aW9uIHdhcyBhZGRlZAogICAgICAgIGZ1bmNfbWFwW3doaWNoXShwdHIsIHZhbCk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RkOjpjZXJyIDw8ICJGdW5jdGlvbiBcIiIgPDwgd2hpY2ggPDwgIlwiIGlzIG5vdCBpbiB0aGUgbWFwIVxuIjsKICAgICAgICByZXR1cm47IC8vIG9yIHRocm93CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgLy8gYWRkIGZ1bmN0aW9ucyB0byB0aGUgbWFwCiAgICBmdW5jX21hcFsiZmlyc3QiXSA9ICZmMTsKICAgIGZ1bmNfbWFwWyJzZWNvbmQiXSA9ICZmMjsKICAgIG15TWFpbkZpdCgiZmlyc3QiLCBudWxscHRyLCA0Mik7CiAgICBteU1haW5GaXQoInNlY29uZCIsIG51bGxwdHIsIDIwKTsKICAgIG15TWFpbkZpdCgiaW5leGlzdGVudCIsIG51bGxwdHIsIDEwKTsKfQo=