CLI фреймворк для C++: cppcli — создание консольных приложений

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI фреймворк для C++: cppcli — создание мощных консольных приложений

Разработка консольных интерфейсов (CLI) на C++ часто требует ручного парсинга аргументов, обработки флагов и организации команд. Библиотека cppcli предоставляет готовый фреймворк для быстрого создания профессиональных CLI-приложений. Она позволяет сосредоточиться на бизнес-логике, а не на инфраструктуре ввода-вывода. В этой статье мы разберём ключевые возможности cppcli, приведём примеры кода и покажем, как интегрировать её в ваш проект.

Основные возможности cppcli

  • Декларативное определение команд — каждая команда описывается как отдельный класс или лямбда-функция.
  • Автоматический парсинг аргументов — поддержка позиционных, именованных аргументов и флагов.
  • Цветной вывод и форматирование — встроенные утилиты для styled output (ANSI-цвета, таблицы, прогресс-бары).
  • Валидация и справка — автоматическая генерация help-сообщений и проверка обязательных аргументов.
  • Расширяемость — поддержка пользовательских типов аргументов и middleware.

Быстрый старт: установка и первый пример

cppcli распространяется как header-only библиотека. Для установки склонируйте репозиторий или используйте CMake FetchContent. Подключение в проект:

#include <cppcli/cli.h>
#include <iostream>

int main(int argc, char* argv[]) {
    cppcli::App app("Моё приложение", "1.0.0");
    app.run(argc, argv);
    return 0;
}

Это минимальный каркас. Теперь добавим команду greet, которая принимает имя пользователя.

Пример: команда с аргументами

#include <cppcli/cli.h>

int main(int argc, char* argv[]) {
    cppcli::App app("Greeter", "1.0.0");

    app.command("greet", "Приветствует пользователя")
        .argument<std::string>("name", "Имя пользователя")
        .action([](const cppcli::Args& args) {
            std::string name = args.get<std::string>("name");
            std::cout << "Привет, " << name << "!\n";
        });

    app.run(argc, argv);
    return 0;
}

Запуск: ./app greet Иван выведет Привет, Иван!. Если аргумент не указан, cppcli выведет ошибку и справку.

Флаги и опциональные параметры

Добавим флаг --formal для формального приветствия:

app.command("greet", "Приветствует пользователя")
    .argument<std::string>("name", "Имя")
    .flag("--formal", "-f", "Формальное приветствие")
    .action([](const cppcli::Args& args) {
        std::string name = args.get<std::string>("name");
        bool formal = args.get<bool>("formal");
        if (formal)
            std::cout << "Здравствуйте, " << name << "!\n";
        else
            std::cout << "Привет, " << name << "!\n";
    });

Теперь ./app greet Иван --formal выведет Здравствуйте, Иван!.

Вложенные команды и подкоманды

cppcli поддерживает древовидную структуру команд. Например, для утилиты управления проектами:

app.command("project", "Управление проектами")
    .command("create", "Создать проект")
        .argument<std::string>("name", "Имя проекта")
        .action([](const cppcli::Args& args) {
            std::cout << "Создан проект: " << args.get<std::string>("name") << "\n";
        })
    .command("delete", "Удалить проект")
        .argument<std::string>("name", "Имя проекта")
        .flag("--force", "Без подтверждения")
        .action([](const cppcli::Args& args) {
            // логика удаления
        });

Вызов: ./app project create myapp.

Продвинутые возможности: кастомные валидаторы и middleware

Рекомендаций