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 {}; }
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...
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