Und hier ist ein Artikel über Boost aus einigen meiner gesammelten Materialien. Ich mache Sie auf eine Variante aufmerksam, ein Konsolenprogramm mit Unterstützung für das Konsolenmenü zu schreiben, das mit boost::program_options implementiert wird.
boost::program_options ist verantwortlich für die Verarbeitung der an das Programm übergebenen Argumente und das Setzen aller notwendigen Variablen, ohne langwierige Logik aus if else -Zweigen implementieren zu müssen. Dies ist bereits in boost::program_optons implementiert.
Angenommen, unser Programm nimmt die folgenden Daten als Argumente
-
Pfad zur Eingabedatei
*Pfad zur Ausgabedatei - die Größe des verarbeiteten Blocks, egal was, wir werden nichts damit machen, es gibt nur einen solchen Parameter im Programm.
Das Programm wird auch ein Hilfemenü haben, das dieses Konsolenmenü sein wird.
Die folgende Abbildung zeigt ein Beispiel für die Verwendung dieses Programms.
Projektstruktur
Dieses Programm wird mit dem CMake-Buildsystem geschrieben, ohne die Qt-Bibliothek zu verwenden. Dies wird ein reines Tutorial für Boost sein.
Schauen wir uns die Struktur des Projekts an.
Dieses Projekt hat
- CMakeLists.txt - CMake-Konfigurationsdatei
- main.cpp - Datei mit main-Funktion
- EApplication.h - Header-Datei der Hauptanwendungsklasse
- EApplication.cpp - Quellcodedatei der Hauptanwendungsklasse
Schreiben wir ein Projekt mit OOP.
CMakeLists.txt
Lassen Sie uns zunächst die Projektkonfiguration behandeln, da dieses Projekt mit der Boost-Bibliothek geschrieben wurde, muss es konfiguriert werden, damit es funktioniert.
Ich nehme zur Kenntnis, dass dieses Projekt unter dem Betriebssystem Linux erstellt wurde, daher kann es zu Unterschieden in den Einstellungen unter dem Betriebssystem Windows oder Mac OS kommen.
Wenn Sie das Boost-Entwicklungskit nicht installiert haben, können Sie dies beispielsweise unter Ubuntu so tun
sudo apt-get install libboost-all-dev
Schauen wir uns den Projektaufbau an
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()
Wie Sie sehen können, habe ich den C++17-Standard eingebunden. In diesem Fall spielt es keine Rolle, Sie können das Projekt auf C++11- oder C++14-Standards aufbauen.
Dies ist die mindestens erforderliche Version von CMake. Diese Version wurde auf meinem PC installiert.
Dann suchen wir nach den Boost-Komponenten, die wir brauchen.
- Dateisystem - Wir speichern Informationen über die Datei
- program_options - um das Konsolenmenü zu bilden
Die Bedingung if enfif gibt Bibliotheken, ihre Header-Dateien und Projektquelldateien an.
main.cpp
Schauen wir uns den Inhalt der Datei mit der Funktion main an. Dort wird eine Anwendungsinstanz erstellt und ihre Methode exec() wird ausgeführt, um die Hauptprogrammlogik auszuführen.
#include <iostream> #include "EApplication.h" int main(int argc, const char* argv[]) { EApplication app(argc, argv); return app.exec(); }
EApplication.h
Und jetzt das Interessanteste, das Programm selbst mit dem Konsolenmenü.
#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; }
Schlussfolgerungen
Diese boost::program_options -Bibliothek ist wirklich sehr nützlich und ermöglicht es Ihnen, viele Probleme beim Schreiben eines Konsolenmenüs zu beseitigen. Zumindest ermöglicht es Ihnen, sehr kompakten Code zu schreiben und Menüs sehr schnell in eine Konsolenanwendung einzubetten.