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