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"