Вопрос

Я использую библиотеку boost :: program_options для обработки параметров командной строки. Мне нужно принять имя файла с помощью опции -r, в случае, если оно пустое (-r дано без параметров), мне нужно использовать stdin.

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

В этом случае boost не принимает -r без параметров и выдает исключение. Параметр default_value () не работает так же хорошо, как и возвращаемое библиотекой значение, даже если пользователь не указал параметр -r.

Есть идеи, как обойтись?

Это было полезно?

Решение

Пожалуйста, используйте метод implicit_value , например,

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

Это позволяет опции принимать либо 0, либо 1 токен, и если токены не предоставлены, он будет действовать так, как если бы был указан stdin. Конечно, вы можете выбрать любое другое неявное значение, включая пустую строку и '-', как это предложено mch.

Другие советы

Вы можете попробовать трюк с опциями multitoken и zero_tokens :

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;

Затем просто посчитайте количество элементов в векторе replay . Возможно, вы захотите выдать ошибку, если в аргумент replay передано несколько аргументов.

Я не думаю, что какие-либо библиотеки синтаксического анализа командной строки позволяют вам иметь параметры, которые могут принимать аргумент или нет. Если для параметра требуется аргумент, вы должны указать его. В этом случае стандартная практика (в любом случае, в * NIX) заключается в использовании «-» в качестве имени файла для обозначения того, что вы хотите читать из стандартного ввода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top