configurazione dinamica con spinta program_options
-
09-10-2019 - |
Domanda
C'è un modo per caricare un file INI dinamica come quella qui sotto.
[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
Qui l'idea è che i server che sono definite qui è molto specifico per la distribuzione del software; così l'amministratore decide quanti server partecipare alla configurazione.
C'è un modo per gestire questa situazione in program_options Boost?
Soluzione
Un altro modo potenzialmente più standard, sarebbe come questo:
[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
In questo modo non è necessario preoccuparsi di nomi di sezione indefiniti, e credo che questo stile è più ampiamente utilizzato come bene (sicuramente è come QuickFIX fa, in un modo molto simile a quello che ho descritto).
E probabilmente si può rimuovere la voce number_of_servers
, e basta usare la funzione count()
per trovare quante sezioni server
ci sono.
Altri suggerimenti
C'è un parametro bool
opzionale per consentire le voci non registrati nella funzione parse_config_file
. E 'impostata su false per impostazione predefinita. Vedere la documentazione qui:
Se si chiama questa funzione con true
allora sarà aggiungere tutte le voci registrate nel variables_map
come stringhe. È possibile verificare se esistono con la funzione variables_map::count
.
Mi auguro che aiuta.
Certo che puoi. Le sezioni di server hanno un modello: basta caricare tutti coloro che corrisponde al modello in un elenco di server
.Le sfide che ha affrontato durante la risoluzione era quello di assicurarsi che le sezioni sono tenute insieme e sono alcun modo confuso.
Alla fine mi sono affidato a un options_description con le note opzioni / finiti e quindi utilizzando le parsed_options che vengono fuori parse_config_file, ho dovuto raccogliere tutte le opzioni non riconosciute (collect_unrecognized). Poi ho dovuto scorrere esso a raccogliere le opzioni in ordine.
Grazie ognuno per il loro contributo.