26 Şubat 2019 Salı

C++17 std::optional kullanımı

std::optional C++17 ile eklenmiş yeni bir tiptir. std::optional  kullanarak, bir değer içeren veya null (geçerli değer içermeyen) değere sahip değişkenler tanımlayabilirsiniz. Yani özünde bir değer ve bir değer içerip/içermediğini ifade eden bir flag barındıran bir değişken tanımlayabiliriz. Bu özellik c++ için yaygın kullanılan boost kütüphanesinde zaten uzun yıllardır mevcut idi(boost::optional). Bu yazı kapsamında C++ ile optional kullanımına dair bir örnek paylaşılmıştır.


İlk olarak değinmek istediğim nokta şu; eğer Visual Studio ile std::optional'ı kullanmaya çalıştığınızda C++17 aktif değil dolayısıyla std::optional tanımlı değil diye bir uyarı alırsanız, yapmanız gereken ayar şu. (Additional options'a c++latest yazarak da en son versiyonu aktif edebilirsiniz)


Hangi durumlarda std::optional kullanalım?

std::optional tipini kullanarak geçersiz bir değere sahip olabilecek bir değişkeni nullptr ya da -1,0 gibi spesifik değerler ile ifade etme zorunluluğunu ortadan kaldırabilirsiniz. Veya bir değer hesaplayıp dönen bir fonksiyon içerisinde hata alınması durumunda, geriye boş değer döndürebilirsiniz. Gerçekleştireceğimiz örnek de bu kapsamda basit bir uygulama olacak. str_to_int isminde string bir parametre alıp bunu int değere dönüştüren basit bir fonksiyon yazacağız. Bu fonksiyon eğer dönüştürme işlemini başaramazsa, geri dönülen std::optional<int> tipindeki değişkenin flag değerini kontrol ederek, işlem sonucunu ekranda görüntüleyeceğiz. Bu amaçla yazdığımız 2 method aşağıda paylaşılmıştır.


#include <string>
#include <cctype>
#include <iostream>
#include <optional>

bool is_number(const std::string& s)
{
 std::string::const_iterator it = s.begin();
 while (it != s.end() && std::isdigit(*it)) ++it;
 return !s.empty() && it == s.end();
}

std::optional<int> str_to_int(std::string str) {

 if (is_number(str)) {
  int x = std::stoi(str);
  return  std::optional<int>(x);
 }
 return {};
}

Eğer str_to_int fonksiyonuna gönderilen değer int değere dönüştürülebiliyorsa, ekranda int değeri görmek istiyoruz. Eğer işlem başarısız ise ekranda "return null" uyarısı verebiliriz.


int main()
{

 std::optional<int> opt = str_to_int("25");

 if (opt.has_value())
  std::cout << "str_to_int(25) returned "<< opt.value() << '\n';
 else
  std::cout << "str_to_int(25) return null " << '\n';

 
 opt = str_to_int("x25");

 if (opt.has_value())
  std::cout << "str_to_int(x25) returned " << opt.value() << '\n';
 else
  std::cout << "str_to_int(x25) return null " << '\n';

 return 0;
}
Ekran çıktısı





Bu örnekte optional kullanarak değişkenin geçerli bir değer içerip içermediğini, değişkenin değeri ile birlikte fonksiyondan geri almış olduk. Örneği incelerseniz, optional tipi için bahsettiğimiz flag değerini has_value() metodu ile kontrol etiğimizi göreceksiniz. Eğer bu kontrolü yapmazsak, "x25" değeri için std::bad_optional_access  hatası alırız. 


Her türlü görüş, öneri ve sorularınızı İletişim sayfası aracılığıyla iletebilirsiniz...


Hiç yorum yok:

Yorum Gönder