I use the Boost program parameter library to parse command line arguments.
I have the following requirements:
- After providing "help", all other options are optional;
- When "help" is not provided, all other parameters are required.
How can I handle this? Here is my code handling this and I found it very redundant and I think it should be easy to do, right?
#include <boost/program_options.hpp> #include <iostream> #include <sstream> namespace po = boost::program_options; bool process_command_line(int argc, char** argv, std::string& host, std::string& port, std::string& configDir) { int iport; try { po::options_description desc("Program Usage", 1024, 512); desc.add_options() ("help", "produce help message") ("host,h", po::value<std::string>(&host), "set the host server") ("port,p", po::value<int>(&iport), "set the server port") ("config,c", po::value<std::string>(&configDir), "set the config path") ; po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); if (vm.count("help")) { std::cout << desc << "\n"; return false; } // There must be an easy way to handle the relationship between the // option "help" and "host"-"port"-"config" if (vm.count("host")) { std::cout << "host: " << vm["host"].as<std::string>() << "\n"; } else { std::cout << "\"host\" is required!" << "\n"; return false; } if (vm.count("port")) { std::cout << "port: " << vm["port"].as<int>() << "\n"; } else { std::cout << "\"port\" is required!" << "\n"; return false; } if (vm.count("config")) { std::cout << "config: " << vm["config"].as<std::string>() << "\n"; } else { std::cout << "\"config\" is required!" << "\n"; return false; } } catch(std::exception& e) { std::cerr << "Error: " << e.what() << "\n"; return false; } catch(...) { std::cerr << "Unknown error!" << "\n"; return false; } std::stringstream ss; ss << iport; port = ss.str(); return true; } int main(int argc, char** argv) { std::string host; std::string port; std::string configDir; bool result = process_command_line(argc, argv, host, port, configDir); if (!result) return 1; // Do the main routine here }
c ++ boost required optional boost-program-options
Peter Lee Mar 22 '11 at 17:37 2011-03-22 17:37
source share