Yazılım Geliştirme: C++26'da Joker Karakterler ve Genişletilmiş Karakter Kümeleri

Saberie

Active member


  1. Yazılım Geliştirme: C++26'da Joker Karakterler ve Genişletilmiş Karakter Kümeleri

Geçtiğimiz birkaç haftadır Reflection ve Contracts'a sunduğum önemli eklemelere ek olarak, C++26 ayrıca bazı daha küçük, daha kullanışlı eklemeler de içeriyor.


Duyuru








Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.













Yer tutucu


Yapılandırılmış bağlamalar, birden çok değişkeni yapılandırılmış bir nesnenin öğelerine bağlamanıza olanak tanıyan bir C++17 özelliğidir.

Aşağıdaki program, bir işlevden birden çok değeri döndürmek ve atmak için tanımlama dizilerinin ve yapılandırılmış bağlamaların kullanımını göstermektedir.


// placeholder1.cpp

#include <tuple>
#include <string>
#include <iostream>

// Function that returns three values
std::tuple<int, std::string, double> getThreeValues() {
int intValue = 42;
std::string strValue = "example";
double doubleValue = 3.14;
return std::make_tuple(intValue, strValue, doubleValue);
}

int main() {

// Retrieve the three values using structured binding
auto [intValue, strValue, doubleValue] = getThreeValues();

// Print the values
std::cout << "Integer: " << intValue << 'n';
std::cout << "String: " << strValue << 'n';
std::cout << "Double: " << doubleValue << 'n';

}


fonksiyon getThreeValues üç farklı veri türünü içeren bir demet döndürecek şekilde tanımlanır: bir intA std::string ve bir double. Bu değerler daha sonra dahil edilir std::make_tuple bir demet içinde paketlenir ve işlev tarafından döndürülür.

içinde mainfonksiyon, program üçünü çağırır getThreeValues yapılandırılmış bağlamalar kullanılarak döndürülen değerler. Yapılandırılmış bağlamalar, programın tuple'ı doğrudan üç ayrı değişkene paketlemesine olanak tanır: intValue, strValue VE doubleValue. Bu, kodu daha okunaklı hale getirir ve demetin manuel olarak açılmasından daha basit hale getirir.

Bazen üç işlev değerine de ihtiyacınız olmaz getThreeValues.


// placeholder2.cpp

#include <tuple>
#include <string>
#include <iostream>

// Function that returns three values
std::tuple<int, std::string, double> getThreeValues() {
int intValue = 42;
std::string strValue = "example";
double doubleValue = 3.14;
return std::make_tuple(intValue, strValue, doubleValue);
}

int main() {

// Retrieve the three values using structured binding
auto [_, strValue, doubleValue] = getThreeValues();

// Print the values
std::cout << "String: " << strValue << 'n';
std::cout << "Double: " << doubleValue << 'n';

}


Bu sefer yapacak intValue fonksiyondan getThreeValues aşağıdaki kodda gerekli değildir. Geleneksel olarak bunu alt çizgiye bağlarım.

Bu aynı zamanda derleyicinin değişken nedeniyle bir uyarı vermediği anlamına da gelir. _ kullanılmaz:

Ne yazık ki, bu mantığa aykırı olabilir _ tanımlayıcı olarak yalnızca bir kez kullanılabilir. Bu sınırlama artık C++26 için geçerli değildir:


// placeholder3.cpp

#include <tuple>
#include <string>
#include <iostream>

// Function that returns three values
std::tuple<int, std::string, double> getThreeValues() {
int intValue = 42;
std::string strValue = "example";
double doubleValue = 3.14;
return std::make_tuple(intValue, strValue, doubleValue);
}

int main() {

// Retrieve the three values using structured binding
auto [_, strValue, _] = getThreeValues();

// Print the values
std::cout << "String: " << strValue << 'n';

}


Bu varyantta ne intValue ne de o doubleValue fonksiyondan getThreeValues gerekli. Sürekli olarak iki alt çizgi kullanıyorum.

Genişletilmiş karakter seti


Temel karakter setinde üç yeni karakter mevcuttur:








Aşağıdaki program ham değişmez dizeler için üçünü de kullanır.



#include <iostream>

int main() {

std::cout << 'n';

auto raw1 = R"@(Hellon)@";
auto raw2 = R"$(Hellot)$";
auto raw3 = R"`(Hellob)`";

std::cout << "raw1: " << raw1 << 'n';
std::cout << "raw2: " << raw2 << 'n';
std::cout << "raw3: " << raw3 << 'n';

std::cout << 'n';

}


Program daha sonra üç ham dize değişmezini tanımlar: raw1, raw2 VE raw3. Ham dize değişmezleri C++'da kullanılır delimiter(...)delimiter dahil, nerede delimiter herhangi bir karakter dizisi olabilir. Yani dize gibi özel karakterler içerebilir n, t O b yorumlanmasına gerek kalmadan dahil edilmiştir.

  • raw1 şu şekilde tanımlanır: R„@(Hellon)@“metin hangisi Hellon o olmadan içerir n satır sonu olarak yorumlanır
  • raw2 şu şekilde tanımlanır: R„$(Hellot)$“metinden daha Hellot içerir, olmadan t sekme karakteri olarak yorumlanacak
  • raw3 şu şekilde tanımlanır: R„`(Hellob)`“metinden daha Hellob o olmadan içerir b geri tuşu olarak yorumlanır.
Son olarak programın çıktısını görüyoruz:








Bir sonraki adım nedir?


Çekirdek C++26 dili, paket indeksleme gibi ek iyileştirmeler sunar. Bir sonraki blog yazımda bundan bahsedeceğim.


(Ben)
 
Üst