Я пытаюсь добиться динамической реализации в C ++, что я имею в виду, создавая экземпляры из строк класса. Но после некоторого копания я обнаружил, что, похоже, C ++ изначально не поддерживает такую функцию, как эта.
Например, у меня есть «Интерфейс» с именем Person
и некоторые конкретные реализации, такие как Worker
, Teacher
, Programmer
и т. Д. В C ++, если я хочу сохранить все реализации в карте collection
, я должен написать что-то вроде этого:
#include <map>
#include <string>
#include "Worker.hpp"
#include "Teacher.hpp"
#include "Programmer.hpp"
// ...
using namespace std;
int main() {
map<string, Person*> collection;
Worker worker;
Teacher teacher;
Programmer monkey;
// ...
collection[worker->title] = &worker;
collection[teacher->title] = &teacher;
collection[monkey->tittle] = &monkey;
// ...
}
Кажется, все в порядке, но я не люблю менять три места в коде каждый раз, когда добавляю должность.
То, что я хотел бы сделать, выглядит следующим образом:
#include <map>
#include <string>
#include "Worker.hpp"
#include "Teacher.hpp"
#include "Programmer.hpp"
# ...
using namespace std;
int main() {
map<string, Person*> collection;
char titles[][20] = {"Worker", "Teacher", "Programmer"};
for (auto const &Title: titles) {
// this is the magic I would like to have.
Title object;
collection[title] = &object;
}
}
К сожалению, в C ++ нет магии.
Так что через некоторое время я понимаю, что есть макрос и препроцессор, может быть, я смогу обойти это. И вот что я могу придумать до сих пор:
#include <map>
#include <string>
#include <iostream>
#include "Worker.hpp"
#include "Teacher.hpp"
#include "Programmer.hpp"
# ...
#define PUSH(name)\
name o_##name;\
collection[o_##name.title] = &o_##name;\
using namespace std;
int main() {
map<string, Person*> collection;
PUSH(Worker);
PUSH(Teacher);
PUSH(Programmer);
return 0;
}
Я пытался автоматизировать директиву #include
, но, похоже, в макросе отсутствует понятие переменной. и препроцессор не интерпретирует макрос дважды.
Есть идеи, как мне добиться чего-то подобного?
Я знаю, что звучать глупо - копать свою голову в чем-то бесполезном, но это только моя особенность: я не могу избавиться от этой идеи, если она не оказалась правильной или неправильной.
Я бы очень признателен за совет.
Редактировать:
Спасибо за все ваши усилия, чтобы помочь мне. Я был немного неясен по этому вопросу. Что я на самом деле хотел реализовать, так это
Я хотел создать множество программ и позволить пользователю решать, что запускать. Потенциальная проблема заключается в том, что я мог бы в конечном итоге получить тонны оператора if-else
, чтобы позволить пользователю решать, что запускать, потому что я хотел написать тонны маленьких кусочков кода в проекте.
Я не уверен, уясню ли я в этот раз. Но я уже отказался от этой идеи и использовал систему тестирования для выполнения этой работы.
Еще раз всем спасибо.