Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to accept empty value in boost::program_options

I'm using boost::program_options library to process command line params. I need to accept a file name via -r option, in case if it is empty (-r given without params) I need to use stdin.

desc.add_options()
 ("replay,r", boost::program_options::value<std::string>(), "bla bla bla")

In this case boost wouldn't accept -r without params and throw an exception. default_value () option does not work as well as it would make library return value even if user didn't give -r option.

Any ideas how to work around?

like image 963
cppalex Avatar asked Nov 26 '09 16:11

cppalex


2 Answers

Please use the implicit_value method, e.g

desc.add_options()
 ("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")

This makes the option accept either 0 or 1 token, and if no tokens are provided, it will act as if 'stdin' was provided. Of course, you can pick any other implicit value -- including empty string and '-' as suggested by mch.

like image 178
Vladimir Prus Avatar answered Sep 25 '22 04:09

Vladimir Prus


You could try a trick with the multitoken and zero_tokens options:

using namespace std;
namespace po = boost::program_options;

vector<string> replay;

po::options_description desc("Allowed options");
desc.add_options()
    ("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla");

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

if (vm.count("replay"))
{
  size_t s = vm["replay"].as< vector<string> >().size();
  if (s == 0)
    cout << "replay without args" << endl;
  else if (s == 1)
    cout << "replay with one arg" << endl;
  else
    cout << "replay with multiple args" << endl;
}
else
  cout << "replay not specified" << endl;

Then just count the number of elements in the replay vector. You'll want to throw an error if multiple arguments are passed to the replay option.

like image 22
Rômulo Ceccon Avatar answered Sep 21 '22 04:09

Rômulo Ceccon