логические опции из опций программы Boost - PullRequest
5 голосов
/ 24 февраля 2011

Я использую параметры программы Boost для получения логических значений из аргумента командной строки. Я хотел бы, чтобы мой аргумент был указан как «Y», «Да», «N», «Нет».

На самом деле мой код сделал это, используя временную строку,

  1. будет обработан boost program options
  2. проверено по "Y", "Да", "N" или "Нет"
  3. назначен члену логической переменной.

Кроме того, я также использую другую временную строку для получения значения по умолчанию.

Я сделал всю эту работу, так как попробовал приведенный ниже код, который не работал

      namespace pod = boost::program_options;

      ("Section.Flag", 
           pod::value<bool>(&myFlag_bool)->default_value( false ), 
           "description")

Знаете ли вы, можно ли использовать параметры программы Boost лучше, чем тот, который я использую для этого?

1 Ответ

4 голосов
/ 25 февраля 2011

Вы будете разбирать строку так или иначе. Есть несколько вариантов, в основном в зависимости от того, как часто вы будете запрашивать это значение. Вот пример чего-то похожего на то, что я недавно использовал; CopyConstructable и Assignable, поэтому он хорошо работает с STL. Я думаю, что мне нужно было сделать несколько дополнительных вещей, чтобы заставить его работать с program_options, но вы получили суть:

#include <boost/algorithm/string.hpp>

class BooleanVar
{
public:
    BooleanVar(const string& str)
        : value_(BooleanVar::FromString(str))
    {
    };

    BooleanVar(bool value)
        : value_(value)
    {
    };

    BooleanVar(const BooleanVar& booleanVar)
        : value_(booleanVar)
    {
    };

    operator bool()
    {
        return value_;
    };

    static bool FromString(const string& str)
    {
        if (str.empty()) {
            return false;
        }

        // obviously you could use stricmp or strcasecmp(POSIX) etc if you do not use boost
        // or even a heavier solution using iostreams and std::boolalpha etc
        if (
            str == "1" 
            || boost::iequals(str, "y")
            || boost::iequals(str, "yes")
            || boost::iequals(str, "true")
        )
        {
            return true;
        }

        return false;
    };

protected:
    bool value_;
};
...