6 Aralık 2017 Çarşamba

optional

optional Sınıfı
Giriş
Şu satırı dahil ederiz.
#include <boost/optional.hpp>
Bu sınıf kabaca şöyledir.
struct {
  bool _present;
  T _t;
}
none Sabiti
Eğer optional'a değer atanmamış diye belirtmek istersek şöyle yaparız.
f(..., optional<T> default_argument = boost::none)
Constructor
Şöyle yaparız.
boost::optional<int> optType;
Şöyle yaparız
optType = boost::make_optional<int> (2);
Şöyle yaparız
optType = boost::none;
emplace metodu
Şöyle yaparız.Bu metod yerine eski kodlarda in_place yöntemi kullanılıyor.
boost::optional<int> x;
x.emplace(3);
get_value_or_default metodu
Elimizde şöyle bir optional olsun.
boost::optional<TYPE> optType;
Şöyle yaparız.
TYPE t = optType.get_value_or(default);
is_initialized() metodu
Bu metod 1.64 sürüm ile deprecated olarak işaretli. Bu meto yerine boost::none ile karşılaştırma öneriliyor.

operator bool
explicit tanımlıdır. boost::optional if yapısı ile rahatlıkla kullanılabilir. Ancak boost::optional direkt bool'a çevrilemez. Şöyle yaparsak
bool val = boost::optional<SomeType> o;
Çıktı olarak şunu alırız.
error: cannot convert boost::optional<SomeType> to bool in return
operator =
Şöyle yaparız.
boost::optional<MyClass> oi;
oi = MyClass(4, 5);
Free Style Metodlar
operator <<
boost/optional.hpp dosyasında şu metod tanımlı
template<class CharType, class CharTrait, class T>
std::basic_ostream<CharType, CharTrait>&
operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v);
Ama metodun kendisi için şu satırı dahil ederiz.
#include <boost/optional/optional_io.hpp>
Doldurulmamış bir optional nesnesi false döner.
#include <boost/optional.hpp>
#include <iostream>

int main()
{
  boost::optional<int> oi;
  std::cout << oi << "\n"; //False
}
Doldurulmuş bir optional nesnesi ise stream'e ' ' + optional nesnesini yazar.

Kalıtım
Bu sınıf kalıtımı desteklemez. Yani şu kod derlenmez.
class Base {};
class Derived : public Base {};

void func(boost::optional<Base>&) {}

int main () {
  boost::optional<Derived> x;
  func(x); //Error
}

Hiç yorum yok:

Yorum Gönder