регистрация команд

Ответить
ya
^-^
Сообщения: 2675
Зарегистрирован: 16 дек 2021, 19:56

регистрация команд

Сообщение ya »

Чтобы избавиться от повторяющегося кода при регистрации команд, можно использовать массив или контейнер с именами команд и типами классов, и затем через цикл регистрировать их.

### Общий подход:
- Создать массив или `std::vector` структур с именем команды и функцией фабрики (или типом, если используете шаблоны).
- В цикле проходить по этому массиву и вызывать `registerCommand`.

### Пример:

```cpp

Код: Выделить всё

#include <vector>
#include <string>
#include <memory>

// Предположим, что у вас есть функция registerCommand
// и классы Test1Command .. Test6Command, наследующиеся от общего интерфейса

struct CommandRegistration {
    std::string name;
    std::function<std::shared_ptr<Command>()> factory;
};

int main() {
    // Массив или вектор с регистрациями
    std::vector<CommandRegistration> commands = {
        {"test1", [](){ return std::make_shared<Test1Command>(); }},
        {"test2", [](){ return std::make_shared<Test2Command>(); }},
        {"test3", [](){ return std::make_shared<Test3Command>(); }},
        {"test4", [](){ return std::make_shared<Test4Command>(); }},
        {"test5", [](){ return std::make_shared<Test5Command>(); }},
        {"test6", [](){ return std::make_shared<Test6Command>(); }}
    };

    // Цикл регистрации
    for (const auto& cmd : commands) {
        registerCommand(cmd.name, cmd.factory());
    }

    return 0;
}
```

### Обратите внимание:
- В примере используется `std::function` и лямбда-выражения для фабрики.
- Если `registerCommand` принимает `shared_ptr`, то мы создаем его через `std::make_shared` внутри лямбды.
Ответить