Динамическая конфигурация с Boost Program_options
-
09-10-2019 - |
Вопрос
Есть ли способ загрузить динамический файл INI, как тот, который ниже.
[basic]
number_of_servers=3
[server1]
ip=10.20.30.40
password=sdfslkhf
[server2]
ip=10.20.30.41
password=sdfslkhf
[server3]
ip=10.20.30.42
password=sdfslkhf
Здесь идея состоит в том, что серверы, определенные здесь, очень специфичны для развертывания программного обеспечения; Таким образом, администратор решает, сколько серверов участвуют в конфигурации.
Есть ли способ справиться с этим в Boost Program_Options?
Решение
Другой, потенциально более стандартный способ, был бы таким:
[basic]
number_of_servers=3
[server]
name=server1
ip=10.20.30.40
password=sdfslkhf
[server]
name=server2
ip=10.20.30.41
password=sdfslkhf
[server]
name=server3
ip=10.20.30.42
password=sdfslkhf
Таким образом, вам не нужно беспокоиться о неопределенных именах раздела, и я думаю, что этот стиль также более широко используется (определенно это так, как бы Quickfix это, как это, очень похоже на то, что я изложил).
И вы, вероятно, можете удалить number_of_servers
запись, и просто используйте count()
функция, чтобы найти, сколько server
разделы есть.
Другие советы
Есть необязательно bool
Параметр, чтобы разрешить незарегистрированные записи в parse_config_file
функция. Он установлен на ложь по умолчанию. Смотрите документацию здесь:
http://www.boost.org/doc/libs/1_45_0/doc/html/boost/program_options/parse_config_file_id991860.html.
Если вы называете эту функцию с true
Тогда он добавит любые незарегистрированные записи в variables_map
как строки. Вы можете проверить, существуют ли они с variables_map::count
функция.
Надеюсь, это поможет.
Что вы можете. Серверные разделы имеют шаблон: просто загрузите все те, которые соответствуют шаблону в список серверов.
Проблемы, с которыми я сталкивался при решении этого, должен был убедиться, что разделы хранятся вместе и не смешиваются.
В конце концов я полагался на Options_description с известными / конечными вариантами, а затем с помощью Parsed_options, которые выходят из PARSE_CONFIG_FILE, мне пришлось собрать все непризнанные варианты (Collection_unrecognized). Тогда мне пришлось повторить его, чтобы выбрать варианты в порядке.
Спасибо всем за их вклад.