Как принять пустое значение в повышении:: program_options

По моему скромному мнению:

При использовании PHP для веб-разработки, большая часть соединения будет только "жить" для жизни выполнения страницы. Персистентное соединение собирается стоить Вам большого количества издержек, как необходимо будет выразиться на сессии или некоторой такой вещи.

99% времени единственное non-persistant соединение, которое умирает в конце выполнения страницы, будет работать просто великолепно.

другой 1% времени, Вы, вероятно, не должны использовать PHP для приложения, и нет никакого идеального решения для Вас.

12
задан cppalex 26 November 2009 в 16:01
поделиться

3 ответа

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

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

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

27
ответ дан 2 December 2019 в 04:25
поделиться

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

1
ответ дан 2 December 2019 в 04:25
поделиться

Вы можете попробовать трюк с опциями 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 передано несколько аргументов.

6
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: