C++26 kitaplığı: Geliştirilmiş dize işleme
Reflection ve Contracts'taki büyük iyileştirmelere ek olarak, yakında çıkacak olan C++26 standardı birçok küçük ama kullanışlı eklemeyi de beraberinde getiriyor. Bugün yaylar ve buna benzer şeyler hakkında konuşuyoruz string_view.
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.
Her şeyden önce: nedir? string_view?
std::string_view
A std::string_view bir dizeye yönelik tescilli olmayan bir referanstır. Bir dizenin görünümünü temsil eder. Bu dize bir C++ dizesi veya bir C dizesi olabilir. Tipik olarak C++17, temel yazı tipleri için dört tür eşanlamlısı sağlar.
std::string_view std::basic_string_view<char>
std::wstring_view std::basic_string_view<wchar_t>
std::u16string_view std::basic_string_view<char16_t>
std::u32string_view std::basic_string_view<char32_t>
Geriye bir soru kalıyor: neden buna ihtiyacımız var? std::string_view? Google, LLVM ve Bloomberg neden zaten bir dize görünümü uygulamasına sahipti? Cevap basit: Kaynak açısından verimlidir, std::string_view kopyala. A std::string_view yalnızca iki bilgi parçası gerektirir: dizenin işaretçisi ve uzunluğu. Tahmin edebileceğiniz gibi, onlar var std::string_view ve üç erkek kardeşinin esas olarak arayüzde yer aldıkları okuma operasyonlarından std::string sonuçlar. Temel olarak yeni yöntemler kullandıkları için remove_prefix VE remove_suffix almak.
Başarı veya başarısızlığın kontrol edilmesicharconv> işlevler
Fonksiyonlar std::to_chars VE std::from_chars test etmek zordu: if(res.ec == std::errc{}).
İşte cppreference.com'dan basitleştirilmiş bir program:
// charconv.cpp
#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>
template <typename T>
void show_to_chars(T value) {
const size_t buf_size = 5;
char buf[buf_size];
std::to_chars_result result = std::to_chars(buf, buf + buf_size, value);
if (result.ec != std::errc{})
std::cout << std::make_error_code(result.ec).message() << 'n';
else{
std::string_view str(buf, result.ptr - buf);
std::cout << std::quoted(str) << 'n';
}
}
int main() {
show_to_chars(42);
show_to_chars(1234567);
}
Program başlıklar içeriyorcharconv> karakter dönüşümü için,iomanip> giriş/çıkış manipülatörleri için,string_view> tedavisi için string_views Vesystem_error>hata yönetimi için.
Fonksiyon modeli show_to_chars her türlü değeri alır T ve onu bir dizeye dönüştürmeye çalışır. Ortaya çıkan dizeyi depolamak için işlevin içinde 5 boyutunda bir arabellek bildirildi. fonksiyon std::to_chars daha sonra dönüşümü gerçekleştirmek için çağrılır ve sonuç std::to_chars_result-Adlandırılmış nesne result kurtarmak için.
Sonuç nesnesi, dönüştürülen dizenin sonuna yönelik bir işaretçi ve bir hata kodu içerir. Hata kodu aynı değilse std::errc{} dönüşümde bir hata olduğunu gösteren bir hata mesajı görüntülenir std::make_error_code(result.ec).message() konsolda çıktı. Aksi takdirde bir std::string_viewnesne, dönüştürülen dizeyi temsil edecek şekilde oluşturulur ve dizi, kullanılarak oluşturulur. std::quoted tırnak içinde göründüğünden emin olmak için konsola çıktı verin.
içinde main-İşlev, işlev haline gelir show_to_chars iki kez çağrıldı: ilk önce değerle 42 ve sonra değerle 1234567. İlk çağrı değeri dönüştürür 42 başarıyla bir dizeye dönüştürür ve yazdırır. Ancak ikinci çağrı değeri döndürmeye çalışır 1234567 5'lik arabellek boyutunu aşan dönüştürülecek, bu da konsolda bir hata mesajının yazdırılmasına neden olacaktır.
Sonunda program çıktısı gelir:
C++26 sayesinde fonksiyon mevcut std::to_chars bir boole değeri döndürür ve işlev show_to_chars basitleştirilebilir:
template <typename T>
void show_to_chars(T value) {
std::array<char, 5> str;
if (auto result = std::to_chars(str.data(), str.data() + str.size(), value)) {
std::string_view strView(str.data(), result.ptr);
std::cout << std::quoted(strView) << 'n';
}
else
std::cout << std::make_error_code(result.ec).message() << 'n';
}
Fonksiyonun içinde bir std::array Ortaya çıkan dizeyi içerecek şekilde sabit boyutta 5 olarak bildirilen karakterlerin sayısı. fonksiyon std::to_chars daha sonra dönüşümü gerçekleştirmek için çağrılır. Bu işlev, sayısal değeri bir dizeye dönüştürmeyi ve onu diziye eklemeyi dener. str kaydetmek. fonksiyon std::to_chars girmek std::to_chars_resultDönüştürülen dizenin sonuna bir işaretçi ve bir hata kodu içeren nesne.
İşlev bir tane kullanır if– Sonucu elde etmek için talimatlar std::to_chars– Kontrol etmek için arayın. Dönüştürme başarılı olursa sonuç nesnesi örtülü olarak dönüştürülür. true dönüştürülür ve işlev dönüştürülen dizeyi yazdırmaya devam eder. Bu amaçla bir std::string_view-Nesne strView dizeyi dosyanın başından itibaren oluştur str-Dizi şuna kadar result.ptrişaretçi temsil eder. THE std::cout-Stream daha sonra bu dize görünümünü konsola göndermek için kullanılır; std::quoted çıktının tırnak işaretleri içinde görünmesini sağlar.
Dönüştürme başarısız olursa sonuç nesnesi örtülü olarak dönüştürülür. false dönüştürülür ve işlev bunun yerine bir hata mesajı döndürür. Hata mesajını arayarak alıyorsunuz std::make_error_code(result.ec).message()hata kodunu insan tarafından okunabilen bir dizeye dönüştürür.
C++26'da işleme için ek işlevler vardır stringkum string_viewS:
Bir sonraki adım nedir?
Bir sonraki yazımda C++26 kütüphanesinin sunabileceği çok daha fazlası olduğunu gösteriyor.
(Ben)
Reflection ve Contracts'taki büyük iyileştirmelere ek olarak, yakında çıkacak olan C++26 standardı birçok küçük ama kullanışlı eklemeyi de beraberinde getiriyor. Bugün yaylar ve buna benzer şeyler hakkında konuşuyoruz string_view.
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.
Her şeyden önce: nedir? string_view?
std::string_view
A std::string_view bir dizeye yönelik tescilli olmayan bir referanstır. Bir dizenin görünümünü temsil eder. Bu dize bir C++ dizesi veya bir C dizesi olabilir. Tipik olarak C++17, temel yazı tipleri için dört tür eşanlamlısı sağlar.
std::string_view std::basic_string_view<char>
std::wstring_view std::basic_string_view<wchar_t>
std::u16string_view std::basic_string_view<char16_t>
std::u32string_view std::basic_string_view<char32_t>
Geriye bir soru kalıyor: neden buna ihtiyacımız var? std::string_view? Google, LLVM ve Bloomberg neden zaten bir dize görünümü uygulamasına sahipti? Cevap basit: Kaynak açısından verimlidir, std::string_view kopyala. A std::string_view yalnızca iki bilgi parçası gerektirir: dizenin işaretçisi ve uzunluğu. Tahmin edebileceğiniz gibi, onlar var std::string_view ve üç erkek kardeşinin esas olarak arayüzde yer aldıkları okuma operasyonlarından std::string sonuçlar. Temel olarak yeni yöntemler kullandıkları için remove_prefix VE remove_suffix almak.
Başarı veya başarısızlığın kontrol edilmesicharconv> işlevler
Fonksiyonlar std::to_chars VE std::from_chars test etmek zordu: if(res.ec == std::errc{}).
İşte cppreference.com'dan basitleştirilmiş bir program:
// charconv.cpp
#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>
template <typename T>
void show_to_chars(T value) {
const size_t buf_size = 5;
char buf[buf_size];
std::to_chars_result result = std::to_chars(buf, buf + buf_size, value);
if (result.ec != std::errc{})
std::cout << std::make_error_code(result.ec).message() << 'n';
else{
std::string_view str(buf, result.ptr - buf);
std::cout << std::quoted(str) << 'n';
}
}
int main() {
show_to_chars(42);
show_to_chars(1234567);
}
Program başlıklar içeriyorcharconv> karakter dönüşümü için,iomanip> giriş/çıkış manipülatörleri için,string_view> tedavisi için string_views Vesystem_error>hata yönetimi için.
Fonksiyon modeli show_to_chars her türlü değeri alır T ve onu bir dizeye dönüştürmeye çalışır. Ortaya çıkan dizeyi depolamak için işlevin içinde 5 boyutunda bir arabellek bildirildi. fonksiyon std::to_chars daha sonra dönüşümü gerçekleştirmek için çağrılır ve sonuç std::to_chars_result-Adlandırılmış nesne result kurtarmak için.
Sonuç nesnesi, dönüştürülen dizenin sonuna yönelik bir işaretçi ve bir hata kodu içerir. Hata kodu aynı değilse std::errc{} dönüşümde bir hata olduğunu gösteren bir hata mesajı görüntülenir std::make_error_code(result.ec).message() konsolda çıktı. Aksi takdirde bir std::string_viewnesne, dönüştürülen dizeyi temsil edecek şekilde oluşturulur ve dizi, kullanılarak oluşturulur. std::quoted tırnak içinde göründüğünden emin olmak için konsola çıktı verin.
içinde main-İşlev, işlev haline gelir show_to_chars iki kez çağrıldı: ilk önce değerle 42 ve sonra değerle 1234567. İlk çağrı değeri dönüştürür 42 başarıyla bir dizeye dönüştürür ve yazdırır. Ancak ikinci çağrı değeri döndürmeye çalışır 1234567 5'lik arabellek boyutunu aşan dönüştürülecek, bu da konsolda bir hata mesajının yazdırılmasına neden olacaktır.
Sonunda program çıktısı gelir:
C++26 sayesinde fonksiyon mevcut std::to_chars bir boole değeri döndürür ve işlev show_to_chars basitleştirilebilir:
template <typename T>
void show_to_chars(T value) {
std::array<char, 5> str;
if (auto result = std::to_chars(str.data(), str.data() + str.size(), value)) {
std::string_view strView(str.data(), result.ptr);
std::cout << std::quoted(strView) << 'n';
}
else
std::cout << std::make_error_code(result.ec).message() << 'n';
}
Fonksiyonun içinde bir std::array Ortaya çıkan dizeyi içerecek şekilde sabit boyutta 5 olarak bildirilen karakterlerin sayısı. fonksiyon std::to_chars daha sonra dönüşümü gerçekleştirmek için çağrılır. Bu işlev, sayısal değeri bir dizeye dönüştürmeyi ve onu diziye eklemeyi dener. str kaydetmek. fonksiyon std::to_chars girmek std::to_chars_resultDönüştürülen dizenin sonuna bir işaretçi ve bir hata kodu içeren nesne.
İşlev bir tane kullanır if– Sonucu elde etmek için talimatlar std::to_chars– Kontrol etmek için arayın. Dönüştürme başarılı olursa sonuç nesnesi örtülü olarak dönüştürülür. true dönüştürülür ve işlev dönüştürülen dizeyi yazdırmaya devam eder. Bu amaçla bir std::string_view-Nesne strView dizeyi dosyanın başından itibaren oluştur str-Dizi şuna kadar result.ptrişaretçi temsil eder. THE std::cout-Stream daha sonra bu dize görünümünü konsola göndermek için kullanılır; std::quoted çıktının tırnak işaretleri içinde görünmesini sağlar.
Dönüştürme başarısız olursa sonuç nesnesi örtülü olarak dönüştürülür. false dönüştürülür ve işlev bunun yerine bir hata mesajı döndürür. Hata mesajını arayarak alıyorsunuz std::make_error_code(result.ec).message()hata kodunu insan tarafından okunabilen bir dizeye dönüştürür.
C++26'da işleme için ek işlevler vardır stringkum string_viewS:
- Dize akışlarını bağlama std::string_view
- Dize birleştirme ve String_Views
- Aritmetik aşırı yüklemeler std::to_string ve kullanımı std::format
Bir sonraki adım nedir?
Bir sonraki yazımda C++26 kütüphanesinin sunabileceği çok daha fazlası olduğunu gösteriyor.
(Ben)