#include <map>
#include <vector>
#include <iostream>
// Forward declarations needed for defining the global functions.
class typeX;
class typeY;
// Global functions with call by pointer (or reference) to avoid copying objects.
void func(const typeX*) { std::cout << "::func(const typeX&)" << std::endl; }
void func(const typeY*) { std::cout << "::func(const typeY&)" << std::endl; }
// Abstract base class.
class Base {
public:
virtual void func() = 0;
};
void Base::func() {};
// Derived class as replacement for your original typeX.
class typeX : public Base {
public:
void func() { std::cout << "typeX::func()" << std::endl; ::func(this); };
int i; // Example for your original 'typeX' content.
};
// Derived class as replacement for your original typeY.
class typeY : public Base {
public:
void func() { std::cout << "typeY::func()" << std::endl; ::func(this); };
std::string s; // Example for your original 'typeY' content.
};
int main() {
typeX A, B;
typeY Z, Y;
std::map<std::string, Base*> map;
map["a"] = &A;
map["z"] = &Z;
std::vector<std::string> list { "a", "z" };
for (auto const &list_item : list)
map[list_item]->func();
return 0;
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgbmVlZGVkIGZvciBkZWZpbmluZyB0aGUgZ2xvYmFsIGZ1bmN0aW9ucy4KY2xhc3MgdHlwZVg7CmNsYXNzIHR5cGVZOwoKLy8gR2xvYmFsIGZ1bmN0aW9ucyB3aXRoIGNhbGwgYnkgcG9pbnRlciAob3IgcmVmZXJlbmNlKSB0byBhdm9pZCBjb3B5aW5nIG9iamVjdHMuCnZvaWQgZnVuYyhjb25zdCB0eXBlWCopIHsgc3RkOjpjb3V0IDw8ICI6OmZ1bmMoY29uc3QgdHlwZVgmKSIgPDwgc3RkOjplbmRsOyB9CnZvaWQgZnVuYyhjb25zdCB0eXBlWSopIHsgc3RkOjpjb3V0IDw8ICI6OmZ1bmMoY29uc3QgdHlwZVkmKSIgPDwgc3RkOjplbmRsOyB9CgovLyBBYnN0cmFjdCBiYXNlIGNsYXNzLgpjbGFzcyBCYXNlIHsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIGZ1bmMoKSA9IDA7Cn07Cgp2b2lkIEJhc2U6OmZ1bmMoKSB7fTsKCi8vIERlcml2ZWQgY2xhc3MgYXMgcmVwbGFjZW1lbnQgZm9yIHlvdXIgb3JpZ2luYWwgdHlwZVguCmNsYXNzIHR5cGVYIDogcHVibGljIEJhc2UgewpwdWJsaWM6CiAgICB2b2lkIGZ1bmMoKSB7IHN0ZDo6Y291dCA8PCAidHlwZVg6OmZ1bmMoKSIgPDwgc3RkOjplbmRsOyA6OmZ1bmModGhpcyk7IH07CiAgICBpbnQgaTsgIC8vIEV4YW1wbGUgZm9yIHlvdXIgb3JpZ2luYWwgJ3R5cGVYJyBjb250ZW50Lgp9OwoKLy8gRGVyaXZlZCBjbGFzcyBhcyByZXBsYWNlbWVudCBmb3IgeW91ciBvcmlnaW5hbCB0eXBlWS4KY2xhc3MgdHlwZVkgOiBwdWJsaWMgQmFzZSB7CnB1YmxpYzoKICAgIHZvaWQgZnVuYygpIHsgc3RkOjpjb3V0IDw8ICJ0eXBlWTo6ZnVuYygpIiA8PCBzdGQ6OmVuZGw7IDo6ZnVuYyh0aGlzKTsgfTsKICAgIHN0ZDo6c3RyaW5nIHM7ICAvLyBFeGFtcGxlIGZvciB5b3VyIG9yaWdpbmFsICd0eXBlWScgY29udGVudC4KfTsKCmludCBtYWluKCkgewogICAgdHlwZVggQSwgQjsKICAgIHR5cGVZIFosIFk7CgogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEJhc2UqPiBtYXA7CiAgICBtYXBbImEiXSA9ICZBOwogICAgbWFwWyJ6Il0gPSAmWjsKICAgIAogICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3QgeyAiYSIsICJ6IiB9OwogICAgZm9yIChhdXRvIGNvbnN0ICZsaXN0X2l0ZW0gOiBsaXN0KQogICAgICAgIG1hcFtsaXN0X2l0ZW1dLT5mdW5jKCk7CgoJcmV0dXJuIDA7Cn0=