По моему скромному мнению:
При использовании PHP для веб-разработки, большая часть соединения будет только "жить" для жизни выполнения страницы. Персистентное соединение собирается стоить Вам большого количества издержек, как необходимо будет выразиться на сессии или некоторой такой вещи.
99% времени единственное non-persistant соединение, которое умирает в конце выполнения страницы, будет работать просто великолепно.
другой 1% времени, Вы, вероятно, не должны использовать PHP для приложения, и нет никакого идеального решения для Вас.
Используйте метод implicit_value
, например
desc.add_options()
("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")
. Это заставляет опцию принимать либо 0, либо 1 токен, и если токены не предоставлены, он будет действовать как « stdin 'был предоставлен. Конечно, вы можете выбрать любое другое неявное значение, включая пустую строку и '-', как предлагает mch.
Я не думаю, что какие-либо библиотеки синтаксического анализа командной строки позволяют вам иметь параметры, которые могут принимать аргументы или нет. Если вариант требует аргумента, вы должны его указать. В этом случае стандартной практикой (во всяком случае в * NIX) является использование символа «-» в качестве имени файла для обозначения того, что вы хотите читать из стандартного ввода.
Вы можете попробовать трюк с опциями 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 передано несколько аргументов.