Boost.Program_options: пользовательский валидатор с состоянием - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы написать собственный валидатор для параметров командной строки, который может принимать значение среди набора разрешенных значений, например, для таких параметров, как

--animal arg     Allowed values: cat, dog, bird

. Для этого я определил новый тип,RestrictedIdentifierOption:

class RestrictedIdentifierOption
{
public:
    using ValueType = std::pair<std::string, boost::any>;
    using ValueContainer = std::vector<ValueType>;
    explicit RestrictedIdentifierOption(const ValueContainer& allowedValues);
private:
    friend void validate(
        boost::any& v,
        const std::vector<std::string>& values,
        RestrictedIdentifierOption* option,
        int);
private:
    ValueContainer m_allowedValues;
};

и я перегружен validate() согласно документации :

void validate(
    boost::any& v,
    const std::vector<std::string>& values,
    RestrictedIdentifierOption* option,
    int)
{
    ...
}

Наконец, я объявляю опцию:

auto option = boost::make_shared<bpo::option_description>(
    "animal,a",
    new bpo::typed_value<RestrictedIdentifierOption>(new RestrictedIdentifierOption({ { "cat", 1 }, { "dog", 2 }, { "bird", 3 } })),
    "Allowed values: cat, dog, bird");

(Неважно, утечки памяти здесь, это не главное.)

Я наивно ожидал, что аргумент option в validate() будет установлен вэкземпляр, который я создал, однако он всегда равен nullptr.

Разве то, что я пытаюсь сделать, неразумно?Может ли пользовательский валидатор вообще иметь состояние с Boost.Program_options?

...