Фабричный образец, выделяющий память во время компиляции, и как напечатать информацию времени компиляции
Я использую фабричный образец. Это в основном позволяет классам быть зарегистрированными во время компиляции и сохраненными в карте. Затем экземпляр можно вернуть с помощью BaseFactory :: createInstance ()
Я не уверен, как карта содержит имена классов во время компиляции !! Как может быть выделена память во время компиляции, которая действительна во время выполнения?
Весь класс в этом случае является производным от родительского класса Bump_BaseObject
//C++ STL used for adding Reflection
#include <string>
#include <map>
class Bump_BaseObject;
/**
* Derived Base objects creation factory
*/
template<typename T>
Bump_BaseObject* createT(void)
{
#pragma message("createT instantiated")
return new T();
}
struct BaseFactory {
typedef std::map<std::string, Bump_BaseObject*(*)()> map_type;
//return an instance of the class type 's'
static Bump_BaseObject* createInstance(const std::string& s) {
map_type::iterator it = getMap()->find(s);
if(it == getMap()->end())
return 0;
//this is where we instatiate and allocate memory for the object(it must NOT have any arguments)
//we could write a variant that accepts args, but there is no need.
return it->second();
}
//check if 's' is present in the map of registered types
static bool checkIfRegisteredType(const std::string& s) {
map_type::iterator it = getMap()->find(s);
if(it == getMap()->end())
return false;
return true;
}
protected:
static map_type* getMap() {
// never delete'ed. (exist until program termination)
// because we can't guarantee correct destruction order
if(!objectMap) { objectMap = new map_type; }
return objectMap;
}
private:
static map_type * objectMap;
};
#define VALUE_TO_STRING(x) #x
template<typename T>
struct DerivedRegister : BaseFactory {
DerivedRegister(const std::string& s) {
#pragma message("Type registered")
getMap()->insert(std::pair<std::string, Bump_BaseObject*(*)()>(s, &createT<T>));
}
};
Также есть ли способ напечатать имена классов по мере их регистрации?