24 Ağustos 2017 Perşembe

program_options options_description_easy_init Sınıfı

Giriş
Bu sınıf options_description.add_options() metodu tarafından yaratılır. Amacı operator () metodları sunmaktır.

value semantic okunan değerin ne tipte olması gerektiğini belirtir.
notifier okunan değer üzerinde doğrulama yapmak içindir.

Constructor
Şöyle yaparız.
options_description desc ("Hello world!");
desc.add_options ()
    ("help", "Veni vidi vici")
;
operator () metodu - seçenek + açıklama
Şöyle yaparız.
desc.add_options()
  ("help,h", "Show help")
;
Şöyle yaparız.
desc.add_options()("version,v", "print version string")
operator () metodu - seçenek + value semantic + açıklama
bool için şöyle yaparız.
("checkQualitySystem,c", bool_switch(), "only check quality")
string için şöyle yaparız.
("output,o", value<std::string>(), "Output  file ");
operator () metodu - seçenek + value semantic  + default_value + açıklama
default_value, seçenek komut satırında kullanılmazse bile elde edilir .
Örnek
default_value tanımlı bir width seçeneği olsun. Şöyledir.
./a.out             # implies width=75 if that's the default_value for width
./a.out --width=80  # default_value not used
Örnek
string tipinden default value için şöyle yaparız.
("input,i", value<std::string>()->default_value("."), "Input directory")
Örnek
float tipinden default value için şöyle yaparız.
("baseNrate,N", value<float>() -> default_value(0.05), "maximum rate")
Örnek
int tipinden default value için şöyle yaparız
("domainSize,d",  value<int>()->default_value(64), "Domain size" )
Örnek
Kendi enum tipinde default value için şöyle yaparız.
enum class Ipc : int8_t
{
    TCP = 0,
    UDP,
};
po::options_description desc("Usage");
desc.add_options()
  ("ipc,i", po::value<Ipc>()->default_value(Ipc::TCP, "TCP"), "set the ipc");
operator () metodu - seçenek + value semantic  + default_value + notifier + açıklama
notifier için imza şöyle
typed_value * notifier(function1< void, const T & > f);
Kendi sınıfımızı çağırmak için şöyle yaparız.
notifier(boost::bind(&Foo::start_foo, boost::ref(foo), _1))
Lambda çağırmak için şöyle yaparız.
notifier([&foo](const T& v) { return foo.start_foo(v); })
Seçeneğin değerini kontrol edebilmemizi sağlar. Hata varsa exception fırlatılır. Şöyle yaparız.
char v;
("world", po::value<>(&v)->default_value('a')->notifier(
  [](char x) {
    if (x != 'a' && x != 'b')
      throw po::validation_error(
        po::validation_error::invalid_option_value,
        "world", std::string(1, x));
  }),
"An option must be set to either 'a' or 'b'");
operator () metodu - seçenek + value semantic + multitoken + notifier + açıklama
Şu şekildeki satırları parse etmek için kullanılır.
[instruments]
prop= 1 2.9
Şöyle yaparız.
// Setup options.
po::options_description desc("Options");
desc.add_options()
  ("instruments.prop", po::value<std::string>()->multitoken()->
  notifier([&c](std::string const& v) {
    auto it = boost::make_split_iterator(v,
      boost::token_finder(boost::algorithm::is_any_of(" ,")));
      std::transform(it, {}, back_inserter(c), [](auto& s) {
                    return boost::lexical_cast<double>(s);
                    });
  }),
  "plugin names" );

operator () metodu - seçenek + value semantic + implicit_value + açıklama
implicit_value, seçenek komut satırında kullanır ancak değer belirtilmezse elde edilir . implicit_value tanımlı bir width seçeneği olsun. Şöyledir.
./a.out --width     # implies width=75 if that's the implicit_value for width
./a.out --width=80  # implicit value not used
İmzası şöyle
typed_value * implicit_value(const T & v);
Açıklaması şöyle
Specifies an implicit value, which will be used if the option is given, but without an adjacent value. Using this implies that an explicit value is optional, but if given, must be strictly adjacent to the option, i.e.: '-ovalue' or '--option=value'. Giving '-o' or '--option' will cause the implicit value to be applied.
Implicit seçenek bitişik kullanılır. Şöyle yaparız.
./a.out -w80
Ya da Implicit değer = ile kullanılır. Şöyle yaparız.
$ ./opttest --writeMappings=stuff
Şu yanlıştır
./a.out -w 80  # wrong: 80 parsed as extra arg if implicit_value is defined
Kodda şöyle yaparız.
string fname;
("...", po::value<string>(&fname)->default_value("")->implicit_value("-"),"...");
operator () metodu - seçenek + value semantic  + required + açıklama
Şöyle yaparız.
("var1", po::value<int>()->required(), "var1");
operator () metodu - seçenek + value semantic  + multitoken + açıklama
Elimizde şu komut olsun.
a.out -i file0 file1
Aslında bu komut şu komut ile aynıdır.
a.out -i file0 -i file1
Şöyle yaparız.
desc.add_options()
("input-file,i", po::value< vector<std::string> >()->multitoken(), "input file");
operator () metodu - seçenek + value semantic  + required + multitoken + açıklama
Şöyle yaparız.
("rawFastq,f", value< vector<path> >() -> required() -> multitoken(), "raw")
operator () metodu  - seçenek + bound value
options_description_easy_init Sınfı Bound Value yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder