Evgenii Legotckoi
Evgenii LegotckoiЖел. 4, 2018, 5:47 Т.Қ.

Boost - boost::program_options ішіндегі enum пайдалану

Небольшое дополнение к статье по использованию boost::program_options .

В данном дополнении опишу, как использовать перечисления enum. Поскольку сразу они не работают. По умолчанию boost::program_options работают только с базовыми типами и кое-какими типами из стандартной библиотеки, например std::string.


Допустим, у нас есть класс, который содержит в себе перечисление enum .

class Logger
{
public:
    explicit Logger();

    enum VerboseLevel
    {
        E_DEBUG = 0
        E_INFO,
        E_WARNING,
        E_CRITICAL,
    };
};

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

То есть мы хотим вот так настроить наш boost::program_options .

m_desc.add_options()
        (MENU_ITEM_HELP.c_str(), "produce help message")
    ("level",
     po::value<Logger::VerboseLevel>(&m_verboseLevel)->default_value(Logger::E_WARNING), 
     "set verbose level of logging, default level is Info\nLevels: \n0) Debug \n1) Info \n2) Warning \n3) Critical")
        ;
po::store(po::parse_command_line(argc, argv, m_desc), m_vm);  
po::notify(m_vm);

Но при сборке получим ошибку

Error C2338 Target type is neither std::istream`able nor std::wistream`able

В данном случае нам необходимо сделать перегрузку оператора operator>> , чтобы получить возможность устанавливать требуемые нам значения.

Самой просто вариант может выглядеть так

std::istream& operator>>(std::istream& in, Logger::VerboseLevel& verboseLevel)
{
    std::string token;
    in >> token;
    if (token == "0")
        verboseLevel = Logger::VerboseLevel::E_DEBUG;
    else if (token == "1")
        verboseLevel = Logger::VerboseLevel::E_INFO;
    else if (token == "2")
        verboseLevel = Logger::VerboseLevel::E_WARNING;
    else if (token == "3")
        verboseLevel = Logger::VerboseLevel::E_CRITICAL;
    else
        in.setstate(std::ios_base::failbit);
    return in;
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
m
  • molni99
  • Қаз. 26, 2024, 11:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 11:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10

C++ - Тест 003. Условия и циклы

  • Нәтиже:42ұпай,
  • Бағалау ұпайлары-8
Соңғы пікірлер
i
innorwallҚар. 8, 2024, 8:45 Т.Ж.
PyQt5 - Урок 001. QLineEdit IP мекенжайы priligy fda approval The second question is how successful is fertility treatment and that pertains
i
innorwallҚар. 8, 2024, 8:42 Т.Ж.
QML - Сабақ 004. Qt QML-дегі сигналдар мен слоттар J Clin Endocrinol Metab 1977; 45 240 priligy buy Packer M, Rouleau J L, Swedberg K, et al
i
innorwallҚар. 8, 2024, 8:38 Т.Ж.
TLSv1.2-ні Qt 4.8.1-де қалай енгізу керек order priligy online uk An association between fertility treatment and childhood epilepsy has previously been shown in a study of some 80, 000 singletons from the Danish National Birth …
i
innorwallҚар. 8, 2024, 8:14 Т.Ж.
Qt 5.8 шығарылды buy priligy 30mg In all girls gonadotropin levels rise in the newborns after delivery and remain elevated for up to 4 years of age
i
innorwallҚар. 8, 2024, 8:08 Т.Ж.
Qt/C++ - 033-сабақ. QGraphicsItem орнына QGraphicsObject-пен жұмыс істеу Levi bQUxntHwuarMTVjjXj 6 18 2022 donde comprar priligy mexico
Енді форумда талқылаңыз
i
innorwallҚар. 8, 2024, 8 Т.Ж.
добавить qlineseries в функции actigall metoprolol lek paralele HPV, which most often does not show symptoms for several years, can also cause vaginal and vulvar cancer in women and can lead to penile cancer in men buy …
9
9AnonimҚаз. 25, 2024, 7:10 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
F
FynjyШілде 22, 2024, 2:15 Т.Қ.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Бізді әлеуметтік желілерде бақылаңыз