C ++ не имеет отражения , как в C # или Java. Это не ошибка. Отражение было рассмотрено более одного раза и намеренно исключено из языка.
ОДНАКО , вы можете получить что-то близкое к вашему дизайну. Вы должны будете сделать много работы самостоятельно. По сути, вам придется реализовать рефлексию на языке, который намеренно не обеспечивает его.
Ваш текущий дизайн близок. Если бы я реализовал рефлексию так, как вы, кажется, идете, я бы сделал:
class Reflection_registry {
std::map<std::string, Handler*> registry_;
public:
void registerClass(const std::string& name, Handler* handler) {
registry_[name] = handler;
}
Handler* getHandlerForClass(std::string& name) {
std::map<std::string, Handler*>::iterator itor = registry_.find(name);
return itor == registry_.end() ? NULL : itor->second;
}
}
Дело в том, что вы несете ответственность за то, чтобы придумать соответствующие имена, от руки , и поддерживать их в актуальном состоянии. Как и предполагали другие, вы можете использовать typeid
и std::type_info
s для генерации имен - это в значительной степени то, для чего std::type_info
был разработан.