Renforcer. Handy variables_map. Profitant d’avoir spécifié le type dans options_descsortingption

En utilisant boost/program_options en c ++, lorsque je construis la options_description je spécifie le type de chaque option ( fs::path dans ce cas):

 namespace fs = boost::filesystem; namespace po = boost::program_options; po::options_description desc("Example"); desc.add_options() ("help", "Print help messages") ("input,i", po::value(), "Input folder"); 

et je construis le variables_map

 po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); 

Lorsque j’accède à l’option, je dois spécifier à nouveau leur type:

 vm["input"].as() 

et pas

 vm["input"] 

Existe-t-il un moyen plus pratique d’accéder à la carte des variables? Impossible de tirer parti du fait que j’ai déjà spécifié le type de variable_value stocké dans vm ?

J’ai vu que beaucoup de programmeurs finissent par stocker l’option dans une autre variable

 fs::path input = vm["input"].as() 

mais je voudrais éviter de définir des variables redondantes.

C’est là que vous utiliseriez la fonctionnalité de notify du composant Stockage de la bibliothèque .

Live On Coliru

 #include  #include  #include  #include  namespace po = boost::program_options; int main(int argc, char** argv) { namespace fs = boost::filesystem; namespace po = boost::program_options; po::options_description desc("Example"); int i = -99; // some value fs::path v; // the only place where we ever specify the type! desc.add_options() ("help", "Print help messages") ("value,v", po::value(&i)->default_value(42), "Input folder") ("input,i", po::value(&v)->default_value("TheAnswer"), "Input folder"); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); notify(vm); std::cout << i << ", " << v << "\n"; } 

Ici, les conversions ainsi que les spécifications de type elles-mêmes sont implicites. Sortie:

 ./test 42, "TheAnswer" ./test -i /temp/path/foo --value=123 123, "/temp/path/foo"