#include <string>
#include <iostream>
#include <map>
#include <stdexcept>
template<typename T>
class Class1
{
typedef double(T::*memFunc)();
std::map<std::string, memFunc> funcMap;
public:
void addFunc(std::string funcName, memFunc function)
{
funcMap.insert(std::pair<std::string, memFunc>(funcName, function));
}
double callFunc(const std::string& name, T& obj) const
{
typename std::map<std::string, memFunc>::const_iterator i = funcMap.find(name);
if(i!=funcMap.end())
return (obj.*(i->second))();
else
throw std::runtime_error("unknown function " + name);
}
};
class MyClass
{
public:
MyClass()
{
class1.addFunc("new function", &MyClass::getValue);
}
double getValue()
{
return 3.14;
}
void callit()
{
std::cout << "called and got " << class1.callFunc("new function", *this) << '\n';
}
private:
Class1<MyClass> class1;
};
int main()
{
MyClass mc;
mc.callit();
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RkZXhjZXB0PgogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIENsYXNzMQp7CiAgICB0eXBlZGVmIGRvdWJsZShUOjoqbWVtRnVuYykoKTsKICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBtZW1GdW5jPiBmdW5jTWFwOwogcHVibGljOgogICAgdm9pZCBhZGRGdW5jKHN0ZDo6c3RyaW5nIGZ1bmNOYW1lLCBtZW1GdW5jIGZ1bmN0aW9uKQogICAgewogICAgICAgIGZ1bmNNYXAuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgbWVtRnVuYz4oZnVuY05hbWUsIGZ1bmN0aW9uKSk7CiAgICB9CiAgICBkb3VibGUgY2FsbEZ1bmMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFQmIG9iaikgY29uc3QKICAgIHsKICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgbWVtRnVuYz46OmNvbnN0X2l0ZXJhdG9yIGkgPSBmdW5jTWFwLmZpbmQobmFtZSk7CiAgICAgICAgaWYoaSE9ZnVuY01hcC5lbmQoKSkKICAgICAgICAgICAgcmV0dXJuIChvYmouKihpLT5zZWNvbmQpKSgpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJ1bmtub3duIGZ1bmN0aW9uICIgKyBuYW1lKTsKICAgIH0KfTsKIApjbGFzcyBNeUNsYXNzCnsKIHB1YmxpYzoKICAgIE15Q2xhc3MoKQogICAgewogICAgICAgIGNsYXNzMS5hZGRGdW5jKCJuZXcgZnVuY3Rpb24iLCAmTXlDbGFzczo6Z2V0VmFsdWUpOwogICAgfQogICAgZG91YmxlIGdldFZhbHVlKCkKICAgIHsKICAgICAgICByZXR1cm4gMy4xNDsKICAgIH0KICAgIHZvaWQgY2FsbGl0KCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNhbGxlZCBhbmQgZ290ICIgPDwgY2xhc3MxLmNhbGxGdW5jKCJuZXcgZnVuY3Rpb24iLCAqdGhpcykgPDwgJ1xuJzsKICAgIH0KcHJpdmF0ZToKICAgIENsYXNzMTxNeUNsYXNzPiBjbGFzczE7Cn07CmludCBtYWluKCkKewogICAgIE15Q2xhc3MgbWM7CiAgICAgbWMuY2FsbGl0KCk7Cn0=