Haftalık C++ 50 – Rakam ayıraçlar, std::exchange, std::integer_sequence, std::quoted

Bütün takipçilerimin geçmiş bayramını kutluyorum. Yaz döneminin gelmesi ile birlikte yazılarımın sıklığının azaldığının farkındayım, fakat arayı da çok açmama niyetindeyim.
Ayrıca, uzun süreli takipçilerimin hoşuna gidecek bir iki gelişme daha var ki onları da yazımın sonuna saklıyorum 😉

Şimdilik, C++ 14’e ilişkin kalan son bir kaç kabiliyete kısaca değinip, C++ 17 ve 20’de kalan kabiliyetlere devam edebiliriz. Neler kaldı peki? Hemen ilki ile başlayalım.

Rakam Ayıraçları (“Digit Seperators”)

Kabiliyetin isminden de anlaşılacağı gibi, sunulan temel kabiliyet, sayıları ifade ederken artık ayıraç (‘) kullanabilmemiz.

Peki neden buna ihtiyacımız var ya da ihtiyacımız var mı diye sorabilirsiniz? Eğer, küçük sayılar ile uğraşıyorsanız ya da hiç sayılarla işiniz olmuyorsa, evet pek bir anlam ifade etmeyebilir ama gerçek hayatta faturalar ya da farklı mecralarda kullanılan sayılarda da, bu ayıraçların kullanımını görebilirsiniz ve bu ayıraçların okunabiliği nasıl arttırdığını siz de fark edebilirsiniz.

Tabi, C++ programlama dilinde ne yazık ki böyle bir kabiliyet bulunmamaktaydı, ta ki C++ 14’e kadar. C++ 14 ile birlikte, sayıları ifade ederken artık ayıraç (‘) kullanabileceğiz. Hemen bir örneğe bakalım:

yukarıdaki kullanımdan da anlaşılacağı üzere aslında eklenen ayraçlar sadece okunabilirliğe yönelik, sayısal anlamda hiçbir şey değiştirmiyor ki, aslında, önemli olan da okunabilirlik. Yerleri ya da adetlerinin de önemi yok. Bununla birlikte, kullanıcı tanımlı sabitlerin tanımlanmasında da kullanılabiliyorlarmış. Daha farklı bir bakış açısı için kaynaklar kısmına bir video ekliyorum.

std::exchange

Bir diğer C++ 14 kabiliyeti, STL kütüphanesi ile sunulan bir API olan std::exchange fonksiyonu. Bunu kullanabilmek için de <utility> başlık dosyasını eklemeniz gerekiyor.

Her ne kadar ismi ve anlamı, std::swap‘i hatırlatsa da aslında pek aynı değiller (hatta hiç). Peki ne yapar bu kardeşimiz, kısaca, sunulan değeri yenisi ile güncelleyip, eski değeri de dönen bir API olarak düşünmeniz daha doğru olacaktır. Hemen bir örneğe bakalım:

Yukarıdaki ifade ile, b değişkenine c değişkeninin değeri atanmakta ve a değişkenine de b’nin başta sahip olduğu değer atanmaktadır. std::swap‘ten farklı olarak, öncelikle, c değişkeninin içeriği değişmemekte, ayrıca b’nin eski değeri de dönülmekte.

Ha, bütün bunları ben std::swap ya da kendim de yapamaz mıydım? Elbette, yapardınız, başlık dosyasının isminden de anlaşılacağı üzere sizlere bir kolaylık sağlaması adına bunlar sunulmuştur.

Daha detaylı tartışma ve bilgilendirmeler için stackoverflow’daki şu bağlantıya göz atabilirsiniz.

Ayrıca Jason Turner’ın da https://www.youtube.com/watch?v=GEbPRS81py4 videosu faydalı olabilir.

std::integer_sequence, index_sequence, make_integer_sequence, make_index_sequence

C++ 14 ‘le sunulan ve özellikle “template metaprogramming” ile uğraşanların işine yaracak bir kabiliyet de, std::integer_sequence.

Bu sınıf şablonu sayesinde, verilen tipte, ki isminde de anlaşılacağı üzere bunun tam sayı olması lazım, bir değer dizisini daha kolay ifade edebileceğiz. Tabi, burada alışageldiğimiz dizilerden ziyade, derleme zamanında kullanabileceğimiz bir kabiliyet olduğunu tekrar ifade etmek istiyorum.

Diğer yardımcı tanımlamalar da aslında std::integer_sequence‘ı kullanmakta:

template<std::size_t… Ints>
using index_sequence = std::integer_sequence<std::size_t, Ints…>;
template<class T, T N>
using make_integer_sequence = std::integer_sequence<T, /* a sequence 0, 1, 2, …, N-1 */ >;
template<std::size_t N>
using make_index_sequence = std::make_integer_sequence<std::size_t, N>;

Kabiliyetin çok derinliklerine inmeden, basit bir örnek kod ile bu kabiliyeti de işlemiş olalım:

name ve size API’leri de oluşturulan dizinin tip ismi ve eleman adeti göstermek için kullanılmaktadır.

Açıkçası, ben şu ana kadar ki geliştirme faaliyetlerimde buna direk ihtiyaç duymadım ama sizlerin olabilir, öneri sayfasında, daha detaylı motivasyon ve örnek kullanım mevcut.

std::quoted

Gelelim yazımızın son konuğu olan std::quoted API’sine. Öncelikle bu API’yi kullanabilmeniz için <iomanip> başlık dosyasını eklemeniz gerekiyor. Peki bu fonksiyon bize ne sağlıyor?

Temelde, çift tırnak veya benzeri işaretler ile ifade edilen metinleri kolay bir şekilde okumak ya da oluşturmanıza yardımcı oluyor. Bu tarz çift tırnaklı metinler daha çok CSV ve XML dosyalarında (ve dahi başka yerlerde) çok bulunmakta. Bu kabiliyet ile bu tarz metinleri kolay bir şekilde okuyabiliyorsunuz. Örneğe geçmeden şunu da ifade etmekte fayda var, her ne kadar varsayılan olarak çift tırnak kullanılsa da, farklı ve birden fazla da ayıraç kullanılabilmekte. Şimdi, kullanımını daha net ortaya koyacağını düşündüğüm bir örneğe bakalım:

Evet sevgili yazılımperver dostlarım bu yazı ile, C++ 14 yolculuğumuzu da tamamladık.

Şimdi gelelim diğer gelişmeye, uzun sürekli takipçilerim daha önceden SDL2 ile ilgili de bir çok yazı ve örnek kod paylaştığımı hatırlarlar. Uzun süredir aklımda olan ve SDL2 kullanan, çok platform destekli bir görselleştirme kütüphanesi hazırlama fikrini nihayet hayata geçirebildim ve bir süredir üzerinde çalışıyorum, henüz yeterli olgunlukta değil ama yakında sizler ile paylaşıyor olacağım. Bu kütüphane ile, bu sayfada sizler ile paylaştığım kabiliyetler ve araçları da birebir kullanma fırsatı bulacağız inşallah. O zaman kadar kendinize çok iyi bakın, görüşmek dileğiyle.

Kaynaklar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.