24 Ağustos 2017 Perşembe

program_options positional_options_description Sınıfı

Giriş
Bu sınıf belirtilen parametre'nin isimsiz olmasını sağlar. Yani parametre için - veya -- gibi karakterler kullanmak gerekmez.

Bu sınıfı her zaman positional_options_description nesnesine positional(...) çağrısı ile geçmek gerekir. Şöyle yaparız.
 boost::program_options::options_description desc("options");
...
boost::program_options::positional_options_description p;
...

boost::program_options::variables_map vm;

boost::program_options::store(boost::program_options::command_line_parser(argc, argv).
                                      options(desc).positional(p).run(), vm);
Yanlış Kullanım
Açıklaması şöyle
Positionals correspond to option descriptions by long name only.
Şu kod çalışmaz.
boost::program_options::options_description desc("options");
desc.add_options()
  ("file", boost::program_options::value<std::string>(&mps_name)->required(),"input file")
  (",n", boost::program_options::value<int>(&n)->required(),"number")
  ("help", "this help message")
  ;

boost::program_options::positional_options_description p;
p.add("file", 1);
p.add(",n", 1);
Doğrusu şöyledir.
boost::program_options::options_description desc("options");
desc.add_options()
  ("file", boost::program_options::value<std::string>(&mps_name)->required(),"input file")
  ("n,n", boost::program_options::value<int>(&n)->required(), "number")
  ("help", "this help message")
  ;

boost::program_options::positional_options_description p;
p.add("file", 1);
p.add("n", 1);
Constructor
Şöyle yaparız.
po::positional_options_description p;
add metodu
Şöyle yaparız. options_description sınıfında kullanılan isim ile positional_options_description.add() metoduna geçilen isim aynı olmalıdır.
options_description desc{"Options"};
desc.add_options()
  ("help,h", "Help screen")
  ("ip_port", value<std::string>()->required(), "ip:port");

positional_options_description pos_desc;
pos_desc.add("ip_port", -1);
Şöyle yaparız.
desc.add_options()
  ("bar", po::value(&bar), "bar")
  ("command", po::value(&command));

po::positional_options_description p;
p.add("command", -1);

Kullanım
Şöyle yaparız.
command_line_parser parser{argc, argv};
parser.options(desc).positional(pos_desc).allow_unregistered();
parsed_options parsed_options = parser.run();

variables_map vm;
store(parsed_options, vm);
notify(vm);
...
Şöyle yaparız.
po::options_description desc("Allowed options");
...
po::positional_options_description pos;
...

po::variables_map vm;
try {
  po::store(po::command_line_parser(argc, argv).options(desc)
    .positional(pos).run(), vm);
  po::notify(vm);
} catch(const po::error& e) {
  ...
}

Hiç yorum yok:

Yorum Gönder