Как принять пустое значение в boost:: program_options
Я использую 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.
Есть идеи, как работать?
Ответы
Ответ 1
Пожалуйста, используйте метод implicit_value
, например
desc.add_options()
("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")
Это означает, что параметр принимает либо токен 0, либо 1, и если не указаны токены, он будет действовать так, как если бы был предусмотрен "stdin". Конечно, вы можете выбрать любое другое неявное значение - включая пустую строку и "-", как было предложено mch.
Ответ 2
Вы можете попробовать трюк с параметрами 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
. Вы захотите выбросить ошибку, если несколько аргументов переданы в параметр повтора.
Ответ 3
Я не думаю, что любые библиотеки разбора командной строки позволяют вам иметь параметры, которые могут принимать аргумент или нет. Если для параметра требуется аргумент, вы должны указать его. В этом случае стандартная практика (в * NIX в любом случае) заключается в использовании "-" в качестве имени файла для обозначения того, что вы хотите читать со стандартного ввода.