20 Mart 2018 Salı

program_options options_description_easy_init Sınfı Bound Value

Giriş
Parse edilen value_semantic nesnesinin bir değişkene bağlanmasını istersek kullanırız. Bağlamak için po::value() metodu kullanılır.

operator () metodu  - seçenek + bound value
Örnek
Şöyle yaparız.
desc.add_options()
    ("address", po::value<std::string>(&address))
    ("port",    po::value<unsigned int>(&port))
    ;
Örnek
Şöyle yaparız.
desc.add_options()
  ("abc", po::wvalue<std::wstring>()->required(), "Path to abc.txt")
  ("ini", po::wvalue<std::wstring>(), "INI file path.");
Kullanmak için şöyle yaparız.
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);

if (vm.count("ini"))  
{
  wifstream ifs(vm["ini"].as<std::wstring>(););
  if (ifs)
  {
    ...
  }
}
operator () metodu  - seçenek + bound value + açıklama
Değişkenin tipini vermeden şöyle yaparız.
int bar = 0;
desc.add_options()
  ("bar", po::value(&bar), "bar");
Değişkenin tipini vermeden std::array için şöyle yaparız.
std::array<double,3> arr;
...
("arr,a", po::value(&arr), "array test");
Stream'den okumak için metodları tanımlamamız gerekir.
namespace std {
  template <typename T, size_t N>
  istream& operator>>(istream& in, array<T,N>& arr) {
    ...
    return in;
  }
}
Şöyle çağırırız.
./test '1:5:9'
operator () metodu  - seçenek + bound value + default value + açıklama
Tüm debug için verilen seçenekleri yakalamak için şöyle yaparız.
typedef std::vector<unsigned> DebugValues;
DebugValues debug;
...
("debug", po::value<DebugValues>(&debug)->
  default_value(boost::assign::list_of(0), "0")->
  composing(), "set debug level")
Şöyle yaparız.
$ ./a.out --debug 1 --debug 2 //1 ve 2
...
$ ./a.out --debug 4 --debug 1 //1 ve 4
...
$ ./a.out --debug 4 --debug 1 --debug 9 //4 , 1, 9 
... 
Custom Type
Şöyle yaparız.
struct bytesize_option
{
  ...
};

std::ostream& operator<<(std::ostream& os, bytesize_option const& hs);
std::istream& operator>>(std::istream& is, bytesize_option& hs);

namespace {
    static constexpr auto G = std::size_t(1024 * 1024 * 1024);
    static constexpr auto M = std::size_t(1024 * 1024);
    static constexpr auto K = std::size_t(1024);
}

std::ostream& operator<<(std::ostream& os, bytesize_option const& hs)
{
  ...
}

std::istream& operator>>(std::istream& is, bytesize_option& hs)
{
  ...
}
Kendi tipimizden bir değişken tanımlarız.
bytesize_option _max_hdr_size;
Şöyle yaparız.
new po::option_description("server.max-header-size,x",
                                   po::value(&_max_hdr_size)
                                   ->default_value(_max_hdr_size),
                                   "The maximum size (in bytes)")


Hiç yorum yok:

Yorum Gönder