Я хотел бы написать собственный валидатор для параметров командной строки, который может принимать значение среди набора разрешенных значений, например, для таких параметров, как
--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?