Подтвердить что ты не робот

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)
4b9b3361

Ответ 1

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

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

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