Pergunta

Eu estou usando a biblioteca boost :: program_options para params de linha de comando processo. Preciso aceitar um nome de arquivo através da opção -r, no caso, se ele está vazio (-r dado sem parâmetros) Eu preciso usar stdin.

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

Neste caso impulso não aceitaria -r sem parâmetros e lançar uma exceção. default_value opção () não funciona tão bem como ele faria valor de retorno biblioteca mesmo se o usuário não deu opção -r.

Todas as idéias como resolver?

Foi útil?

Solução

Por favor, use o método implicit_value, por exemplo

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

Isso faz com que a opção de aceitar ou 0 ou 1 símbolo, e se não forem fornecidos os tokens, ele vai agir como se foi fornecido 'stdin'. Claro, você pode escolher qualquer outro valor implícito - incluindo string vazia e '-' como sugerido por MCH

.

Outras dicas

Você poderia tentar um truque com as opções multitoken e 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;

Em seguida, basta contar o número de elementos no vector replay. Você vai querer lançar um erro se vários argumentos são passados ??para o repetição opção.

Eu não acho que qualquer bibliotecas linha de comando de análise permitem que você tenha opções que pode tomar um argumento ou não. Se uma opção requer um argumento, você deve dar um. Neste caso, a prática padrão (em * NIX de qualquer maneira) é usar '-' como um nome de arquivo para indicar que você quer ler da entrada padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top