А вот и статья по boost из моих кое-каких накопившихся материалов. Предлагаю вашему вниманию вариант написания консольной программы с поддержкой консольного меню, которое реализуется с помощью boost::program_options .
boost::program_options отвечает за обработку передаваемых программе аргументов и устанавливает все необходимые переменные без необходимости реализовывать длинную логику из if else веток. Это уже реализуется внутри boost::program_optons .
Предположим, что наша программа будет принимать в качестве аргументов следующие данные
- путь к входному файлу
- путь к выходному файлу
- размер обрабатываемого блока, неважно для чего, мы не будем с ним ничего делать, просто есть такой параметр в программе.
Также программа будет иметь меню help, которое и будет данным консольным меню.
На рисунке ниже представлен вариант использования данной программы.
Структура проекта
Данная программа будет написана с использованием системы сборки CMake, без использования Qt библиотеки . Это будет туториал чисто для boost.
Посмотрим на структуру проекта.
В данном проекте есть
- CMakeLists.txt - конфигурационный файл CMake
- main.cpp - файл с main функцией
- EApplication.h - заголовочный файл основного класса приложения
- EApplication.cpp - файл исходных кодов основного класса приложения
Напишем проект с использованием ООП.
CMakeLists.txt
Для начала разберёмся с конфигурацией проекта, поскольку данный проект написан с использованием библиотеки boost, то его нужно настроить, чтобы он заработал.
Отмечу, что данный проект создавался под операционной системой Linux, поэтому могут быть отличия в настройке под операционной системой Windows или Mac OS.
Также, если у вас не установлен комплект разработки Boost, то например под Ubuntu вы это можете сделать так
sudo apt-get install libboost-all-dev
Посмотрим на настройку проекта
cmake_minimum_required(VERSION 3.12) project(Menu) set(CMAKE_CXX_STANDARD 17) find_package(Boost 1.58.0 COMPONENTS filesystem program_options) set(SOURCE_FILES main.cpp EApplication.cpp EApplication.h) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) add_executable(Menu ${SOURCE_FILES}) target_link_libraries(Menu ${Boost_LIBRARIES}) endif()
Как видите, я подключил стандарт C++17. В данном случае это не принципиально, можно собрать проект и на стандартах C++11 или C++14.
Здесь указана минимально требуемая версия CMake. Данная версия была установлена у меня на PC.
Потом ищем необходимые нам компоненты boost.
- filesystem - будем сохранять информацию о файле
- program_options - для формирования консольного меню
В условии if enfif указаны библиотеки, их заголовочные файлы, а также исходные файлы проекта.
main.cpp
Посмотрим на содержимое файла с main функцией. Там будет создаваться экземпляр приложения и выполняться его метод exec() для запуска основной программной логики.
#include <iostream> #include "EApplication.h" int main(int argc, const char* argv[]) { EApplication app(argc, argv); return app.exec(); }
EApplication.h
А теперь самое интересное, сама программа с консольным меню.
#ifndef MENU_EAPPLICATION_H #define MENU_EAPPLICATION_H #include <boost/program_options.hpp> #include <boost/filesystem/fstream.hpp> namespace po = boost::program_options; namespace fs = boost::filesystem; class EApplication { public: explicit EApplication(int argc, const char** argv); int exec(); private: // Описание доступных опций меню po::options_description m_desc {"Allowed options"}; po::variables_map m_vm; // контейнер для сохранения выбранных опций программы // Требуемые в программе переменные для работы с опциями меню size_t m_blockSize; fs::path m_inputFilePath; fs::path m_outputFilePath; }; #endif //MENU_EAPPLICATION_H
EApplication.cpp
#include "EApplication.h" #include <iostream> EApplication::EApplication(int argc, const char **argv) { // Добавляем пункты меню m_desc.add_options() ("help", "produce help message") // Вызов help справки ("input-file,i", po::value<fs::path>(&m_inputFilePath)->composing(), "set input file path") // Входной файл, можно записать либо --input-file, либо -i ("output-file,o", po::value<fs::path>(&m_outputFilePath)->composing(), "set output file path") // Выходной файл ("block-size,b", po::value<size_t>(&m_blockSize)->default_value(1024 * 1024), "set block size in bytes") // Размер блока ; po::store(po::parse_command_line(argc, argv, m_desc), m_vm); // парсим переданные аргументы po::notify(m_vm); // записываем аргументы в переменные в программе } int EApplication::exec() { // Если есть запрос на справку if (m_vm.count("help")) { // То выводим описание меню std::cout << m_desc << std::endl; return 1; } // Если были введены как минимум входной и выходной параметры if (m_vm.count("input-file") && m_vm.count("output-file")) { // то делаем инициализацию программы, но в данном случае только выводим информацию о введённых параметрах std::cout << m_inputFilePath << '\t' << m_outputFilePath << '\t' << m_blockSize << std::endl; } else { // В противном случае предлагаем посмотреть справку std::cout << "Please, use --help option for information" << std::endl; return 1; } // ToDo something // Здесь можем поместить в цикле while() или for(;;) логику программы return 0; }
Выводы
Данная библиотека boost::program_options действительно очень полезна и позволяет избавиться от большого количества проблем при написании консольного меню. Как минимум она позволяет написать очень компактный программный код, а также очень быстро внедрить меню в консольное приложение.