boost :: program_options: недокументированное & quot; * & quot; функция обнаружена, теперь нужен специальный валидатор, который пишет на карту

Я недавно обнаружил недокументированную особенность boost::program_optionsа именно, что он принимает «*» в качестве специального подстановочного знака, который позволяет объявлять группу параметров с одинаковым префиксом, например так:

configOptions.add_options()
("item_*", value<int>(), "items");

Эта декларация работала как ожидалось item_1, item_3и т. д. при отклонении неизвестных опций.
Ну, теперь вопрос, как я могу написать пользовательскую функцию проверки
это заполнит карту ключом параметров и его значением, например так:

map<string, int> itemsMap;
options_description items("items options");
items.add_options()
("item_*",value<map<string, int>>(&itemsMap)->multitoken(), "items")
;

Мой вопрос — как получить ключ проверяемой опции из функции validate ()?

template <typename T> void validate(boost::any& v, const std::vector<std::string>& values, map<string, T> *, int)

22

Решение

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

boost :: program_options: параметры с фиксированным и переменным токеном?

Вариант итерации может показаться более простым для понимания (реализации и чтения), но пользовательский парсер тоже кажется хорошим (хотя я никогда не использовал его).

1

Другие решения

Других решений пока нет …