std::byte türü

C++17 standartları ile dile eklenen yeni türlerden biri std::byte. Yazdığımız programlar bellekteki byte’ları kullanıyor. std::byte türünün amacı bu bellek byte‘larını oldukları gibi temsil etmek. Burada amaç byte‘lardaki tutulan değerlere ne karakter kodu olarak bakmak (ki bunun için zaten char türleri var) ne de onları doğrudan tam sayı değerleri olarak kullanmak (bunun için de tam sayı türlerimiz var). Amaçlanan ham bellek byte‘larını temsil etmek. Sayısal bir hesaplamanın söz konusu olmadığı durumlarda, std::byte türünün kullanılması ile derleme zamanına yönelik katı bir tür kontrolü hedefleniyor.

std::byte türüne ilişkin sentaks kurallarını ve bu türün kullanım olanaklarını tam olarak kavrayabilmek için öncelikle C++17 standartları ile enum türleri konusunda temel sentaksa yapılan bir eklentiyi anlamamız gerekiyor: Artık baz türü (underlying type) belirli olan bir enum nesnesine küme parantezi içinde doğrudan enumarator olmayan bir tam sayı ile ilk değer verilebiliyor. Aşağıdaki koda bakalım:

Bu şekilde ilk değer vermenin geçerli olabilmesi için

    • Baz türün belirlenmiş olması gerekiyor. Geleneksel enum’lar söz konusu olduğunda baz tür bildirimde belirtilmeli. enum class‘lar söz konusu olduğunda ise baz tür belirtilmese de varsayılan baz türün int kabul edildiğini hatırlayalım.
    • Bildirimde ilk değer küme parantezi içinde ve doğrudan verilmeli.
    • Küme parantezi içinde ilk değer verme (brace initialization) kuralları gereği daraltıcı bir tür dönüşümü (narrowing conversion) söz konusu olmamalı.

Aşağıdaki kodu inceleyelim:

Yukarıdaki kodda enum nesnelerine ilk değer vermede (initialization) yeni kurallar, geçerli ve geçersiz bildirimlerle örnekleriyle gösteriliyor. Başlangıçta en azından tuhaf olarak karşılanacak bu yeni sentaksın ana amacı std::byte türünün (ya da ileride oluşturulacak özel bazı türlerin) gerçekleştirimine olanak sağlamak.
std::byte aslında aşağıdaki gibi tanımlanmış bir enum class türü:

Tanımdan da görüldüğü gibi std::byte için baz tür olarak unsigned char türü seçilmiş. Bu durumda std::byte türünden bir nesneye ilk değer verebilmek için çok sınırlı sayıda seçenek söz konusu. Zaten std::byte türü ile hedeflenen bu şekilde katı bir tür denetimi sağlamak:

İlk değer verilmemiş otomatik ömürlü bir std::byte nesnesinin tanımlanması geçerli olsa da böyle bir nesnenin hayata belirlenmemiş bir değer ile (indetermined value) geldiğine dikkat etmemiz gerekiyor.
Öğeleri std::byte türünden olan bir diziye de tam sayılarla ilk değer veremiyoruz:

std::byte sizeof değeri

std::byte baz türü unsigned char olan bir enum türü olduğundan sizeof değerinin 1 olması garanti altında. unsigned char sistemlerin çoğunda 8 bitlik bir tam sayı türü. Ancak farklı sistemlerde char türlerinin bit sayısı farklı olabileceğinden bu değerin kullanılması gereken durumlarda taşınabilirlik sağlamak amacıyla standart limits başlık dosyasında tanımlanan

static constexpr değeri kullanılmalı.

to_integer<> işlev şablonu

std::byte türünden tam sayı türlerine ve tam sayı türlerinden std::byte türüne otomatik tür dönüşümü (implicit type conversion) yok. Ancak bir std::byte nesnesini herhangi bir tam sayı türüne dönüştürmek için to_integer isimli işlev şablonunu kullanabiliyoruz:

std::byte türünden bool türüne  de otomatik tür dönüşümü olmadığından lojik ifade beklenen yerlerde std::byte nesnelerini doğrudan kullanamıyoruz:

bitsel işlemler

Bir std::byte nesnesine yalnızca atama ya da kopyalama yapabilir ya da onu bitsel işlemlere sokabiliriz.
std:byte türü için bitsel işlemler, operatör yüklemesi (operator overloading) mekanizması ile mümkün kılınmış:

Aşağıdaki kodu derleyip çalıştırın:

std::byte türü ve formatlı giriş çıkış işlemleri

std::byte türü için standart kütüphanenin sağladığı formatlı giriş ve çıkış işlevleri (inserter / extractor) bulunmuyor:

Ancak bu işlevleri istersek kodlarını kendimiz dilediğimiz gibi yazabiliriz. Önce formatlı çıkış işlemi için bir işlev (inserter) tanımlayalım:
Şimdi de formatlı giriş işlemi için bir işlev (extractor) tanımlayalım:
std::bitset sınıfını kullanarak std::byte nesnesinin taşıdığı değeri std::string olarak da ifade edebiliriz:
Standart kütüphanenin std::byte türü için bir “literal operator function” (sabit operatör işlevi) tanımlaması belki iyi bir fikir olabilirdi. Böyle bir ihtiyaç söz konusu olduğunda kendi std::byte sabitlerimizi oluşturabilmek için bir işlev tanımlayabiliriz. Aşağıdaki kodu inceleyelim:
Share

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun