9 Temmuz 2020 Perşembe

std::nullopt Yapısı - std::optional Nesnesinin İlklendirilmediğini Belirtir

std::nullopt_t Yapısı
Açıklaması şöyle. Bu yapı boost::optional'daki boost::none ile aynıdır, sadece isim değiştirmiştir.
std::nullopt_t must be a LiteralType and cannot have a default constructor. It must have a constexpr constructor that takes some implementation-defined literal type. 
Açıklaması şöyle
std::nullopt_t is an empty class type used to indicate optional type with uninitialized state. In particular, std::optional has a constructor with nullopt_t as a single argument, which creates an optional that does not contain a value.
nullopt_t şöyle tanımlıdır.
struct nullopt_t
{
    explicit constexpr nullopt_t(int) noexcept {}
};
constexpr nullopt_t nullopt{0};
Amaç aynı nullptr_t'deki gibi kendi kendimizi bu nesneyi yaratamamak.

std::nullopt
Açıklaması şöyle. Yani std::nullopt_t yapısının isim verilmiş hali.
std::nullopt is a constant of type std::nullopt_t that is used to indicate optional type with uninitialized state.
Örnek
Şöyle yaparız.
std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };
Örnek - map içinde arama
Şöyle yaparız.
std::optional<Account> Bank::BalanceEnquiry(long accountNo){
  auto itr = accounts.find(accountNo);
    
  if(itr == accounts.end()) {
    return std::nullopt; // empty value, that's like null from Java
  }

  return std::optional<Account>{itr->second}; // return non-empty value
}  
Kulllanmak için şöyle yaparız.
std::optional<Account> balanceEnquiry = myBank.BalanceEnquiry(someValue);

if(balanceEnquiry) {
    // entry found, we can extract the actual value

    Account foundAccount = balanceEnquiry.value();
}
else {
    // entry not found
}
Örnek - map içinde arama
Bir map içerisinde değer arayan metod için şöyle yaparız.
return it != map.end() ? std::optional(it->second) : std::nullopt;

// alternatively
return it != map.end() ? std::make_optional(it->second) : std::nullopt;
Aynı şeyi şöyle yaparız.
auto get(const std::string& field)
{
  auto it = map.find(field);
  return it != map.end() ? it->second : std::optional<int32_t>{};
}

Hiç yorum yok:

Yorum Gönder