Существует способ сделать это без шаблонов или рефлексии.
Сначала убедитесь, что все классы, которые вы хотите создать из файла конфигурации, имеют общий базовый класс.Давайте назовем это MyBaseClass
и предположим, что MyClass1
, MyClass2
и MyClass3
все наследуются от него.
Во-вторых, вы реализуете фабричную функцию для каждого из MyClass1
, MyClass2
и MyClass3
.Подписи всех этих заводских функций должны быть идентичны.Пример фабричной функции выглядит следующим образом.
MyBaseClass * create_MyClass1(Configuration & cfg)
{
// Retrieve config variables and pass as parameters
// to the constructor
int age = cfg->lookupInt("age");
std::string address = cfg->lookupString("address");
return new MyClass1(age, address);
}
В-третьих, вы регистрируете все фабричные функции на карте.
typedef MyBaseClass* (*FactoryFunc)(Configuration *);
std::map<std::string, FactoryFunc> nameToFactoryFunc;
nameToFactoryFunc["MyClass1"] = &create_MyClass1;
nameToFactoryFunc["MyClass2"] = &create_MyClass2;
nameToFactoryFunc["MyClass3"] = &create_MyClass3;
Наконец, вы анализируете конфигурациюфайл и итерации по нему, чтобы найти все записи, которые определяют имя класса.Когда вы находите такую запись, вы просматриваете ее заводскую функцию в таблице nameToFactoryFunc
и вызываете функцию для создания соответствующего объекта.