Я недавно обнаружил недокументированную особенность 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)
Вам нужно перебрать все аргументы, идентифицирующие, который имеет правильный префикс, или написать собственный анализатор. Инструкции для обоих вариантов приведены в правильном ответе по ссылке ниже:
boost :: program_options: параметры с фиксированным и переменным токеном?
Вариант итерации может показаться более простым для понимания (реализации и чтения), но пользовательский парсер тоже кажется хорошим (хотя я никогда не использовал его).
Других решений пока нет …