C ++ 23: Modüler standart bir kütüphane ve iki yeni işlev
Standart C ++ 23 kütüphanesi etkileyici iyileştirmelerle parlıyor. Bu makalede, standart modüler kütüphaneden ve iki pratik işlevden geçeceğim std:
rint VE std:
rintln yazmak.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Yeni bir dilde her programlama zorluğu “Merhaba Dünya” programı ile başlar. C ++ 98'den bu bizim başlangıç noktamızdı:
#include <iostream>
int main() {
std::cout << "Hello Worldn";
}
Eski alışkanlıklarınızı C ++ 23'te açmalısınız. “Merhaba Dünya” programı şimdi şöyle görünüyor:
import std;
int main() {
std:
rintln("Hello World");
}
Programı analiz etmek istiyorum.
Standart Modüler Kitaplık
C ++ 23, modüler bir standart kütüphaneyi destekler. Basit komutla import std; Standart kütüphanenin tamamı emrinizde. Ayrıca Clobal C gibi işlevler yaparsanız printf kullanmak istiyorsun, yapmalısın import std.compat; kullanmak. İşte ilgili “merhaba dünya” programı printf:
import std.compat;
int main() {
printf("Hello Worldn");
}
Standart modüler kütüphanenin iki önemli gelişimi vardır: önemli ölçüde iyileştirilmiş derleme süresi ve kullanılabilirlik.
Önemli iyileştirme süresi süresi
Standart kütüphanenin içe aktarılması (import std) kelimenin tam anlamıyla “ücretsiz”. Bu, derleme sürelerinin önemli ölçüde azaldığı anlamına gelir. İlk deneyim, derleme sürelerinin en az bir faktör 10 olduğunu göstermektedir. Bu gelişmenin nedeni açıktır. Başlık dosyalarını kademeli olarak eklemek yerine bir form içe aktarın. Bu yüzden tüm standart C ++ 23 kütüphanesini içeren tek bir form var. Şimdiye kadar, yalnızca MSVC derleyicisi bu standart modüler kütüphaneyi destekledi: Eğitim: Standart C ++ kitaplığı, komut satırından modülü kullanarak önemlidir.
Kullanılabilirliğin iyileştirilmesi
Diyelim ki işlevi istiyoruz std::accumulate kullanmak. Hangi başlık dosyasını eklemeniz gerektiğini biliyor musunuz? Başlık dosyasınumeric>,functional> veyaalgorithm>? Belki senin için çok kolaydı. Şimdi göründüğü gibi std::forward Aşağıdaki program neden veya neden tamamlanamıyor?
int main() {
auto list = {1, 2, 3, 4};
}
İfade {1, 2, 3, 4} bir std::initializer_list<int>. Onları kullanmak için başlıkinitializer_list> Kullanılabilir. Tabii ki, bir kap göründüğünde bu başlık otomatik olarak entegre edilir std::vector Kullanılır.
Önceki örnekleri basit bir şekilde karşılaştırın import std; VEYA import std::compat;. Deneyimlerime göre biliyorum: Yeni başlayanlar sadece doğru başlık dosyalarını kullanırken başarısız olmakla kalmaz.
Bunu fark edip etmediğinizi bilmiyorum, ama C ++ 23- “Merhaba Dünya” programım C ++ 23'ün ikinci bir özelliğini kullandı:
std:
rint VE std:
rintln
C ++ 23, her iki işlev için iki aşırı yük sunar:
std:
rint
template< class... Args >
void print( std::FILE* stream,
std::format_string<Args...> fmt, Args&&... args );
template< class... Args >
void print( std::format_string<Args...> fmt, Args&&... args );
std:
rintln
template< class... Args >
void println( std::FILE* stream,
std::format_string<Args...> fmt, Args&&... args );
template< class... Args >
void println( std::format_string<Args...> fmt, Args&&... args );
Arasındaki ilk fark std:
rint VE std:
rintln Açıkçası: std:
rintln Bir satır molası ekleyin. Aşağıdaki noktalar daha da ilginç:
Çeşitli Model
std:
rint VE std:
rintln Çeşitli modellerdir. Çeşitli modeller, herhangi bir sayıda konuyu alabilen modellerdir. Konularınız mükemmel bir şekilde iletilecektir (mükemmel yönlendirme). std:
rint VE std:
rintln Bunlar, tür -fafe varyantıdır printf. İLE printf Biçim zilini belirtmelisiniz. std:
rint VE std:
rintln Yer tutucuları format dizesinde kullanabilirsiniz. Genel olarak, derleyici, yer tutucu için veri türünü kurallardan türetir. std::format C ++ 20'den. Görünüşe göre std:
rint VE std:
rintln C ++ 20'deki format dizeleri için C ++ 23 Şeker Sözdizimsel. İşte C ++ 23'te değiştirilmiş “Merhaba Dünya” programı, std::format kullanılmış.
import std;
int main() {
// std:
rintln("Hello World");
std::cout << std::format("{:}n", "Hello World");
}
Mükemmel inholy'den en çeşitli modele sahipseniz ve std::formaBilmek istiyorum, en eski makalelerimi oku:
Unicode desteği
O std:
rint VE std:
rintln C ++ 2 C ++ 20'deki format dizeleri için sözdizimsel şekerde yanlış gibi görünüyor. Neden std:
rint VE std:
rintln Unicode'u destekleyin. P2093R14 teklifinden bahsetmek istiyorum:
Başka bir sorun, Unicode metninin biçimlendirilmesidir:
std::cout << "Привет, κόσμος!";
Menşe ve yürütme kodlaması UTF-8 ise, bu, GNU/Linux ve macOS üzerinde beklenen çıktıyı üretecektir. Gayri resmi olarak pencerelerde, sistemin Unicode'u tamamen yazdırabilmesine rağmen Mojibake üretilmesi neredeyse garantilidir.
Привет κόσμος!
Visual C ++ kullanılarak /UTF-8 ile tamamlanmış olsa bile ([MSVC-UTF8]). Bunun nedeni, terminalin yürütme kodlamasına bakılmaksızın bu durumda 437 kodunu varsaymasıdır.
Önerilen kartla
std:
rint("Привет, κόσμος!");
“П п, κόσμος!” Programcıların standart yapıları kullanarak akışta bir metin tek kodu yazmasına izin vermesi beklendiği gibi.
Herhangi bir çıktı akımı
Her iki varyant std:
rint VE std
rintln Herhangi bir çıktı akımını kabul eden aşırı yüklemeye sahip olun. Çıktı akımı varsayılan olarak stdout.
std::format Ve bu nedenle std:
rint VE std:
rintln C ++ 23'te sunacak başkaları var. C ++ 23'te standart model kitaplığın bir kapsayıcıyı biçimlendirmek mümkündür.
Bir konteynerin biçimlendirilmiş sürümü
Aşağıdaki program, doğrudan bir STL kabı üretmenin nasıl mümkün olduğunu göstermektedir. Şimdiye kadar, hiçbir C ++ derleyicisi bu işlevi desteklemedi. Sadece yepyeni klan derleyicisi libc++ Bunun yerine libstdc++ Bu işlevi en azından kısmen kullanmanıza izin verir. Tamamen uyumlu bir C ++ 23 uygulamasında yapabilirim std:
rintln yerine std::format kullanmak.
// formatVector.cpp
#include <format>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<int> myInts{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << std::format("{:}n", myInts);
std::cout << std::format("{::+}n", myInts);
std::cout << std::format("{::02x}n", myInts);
std::cout << std::format("{::b}n", myInts);
std::cout << 'n';
std::vector<std::string> myStrings{"Only", "for", "testing", "purpose"};
std::cout << std::format("{:}n", myStrings);
std::cout << std::format("{::.3}n", myStrings);
}
Bu örnekte bir tane kullanıyorum std::vector<int> ve bir std::vector<std::string>. Eğer {:} Her iki kap (1 ve 2) doğrudan yer tutucu olarak görüntülenir. İki Çift Puan Olun {::} yer tutucu içinde kullanılır, std::vector format. Spesifik format ikinci kolonu takip eder.
Sırada ne var?
C ++ 23'te geliştirilen standart kütüphane hakkındaki bir sonraki makalemde, std:
ptional ve yeni veri türü std::expected Hataların tedavisi için mevcut.
(harita)
C ++ 23: Modüler standart bir kütüphane ve iki yeni işlev
Standart C ++ 23 kütüphanesi etkileyici iyileştirmelerle parlıyor. Bu makalede, standart modüler kütüphaneden ve iki pratik işlevden geçeceğim std:


Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Yeni bir dilde her programlama zorluğu “Merhaba Dünya” programı ile başlar. C ++ 98'den bu bizim başlangıç noktamızdı:
#include <iostream>
int main() {
std::cout << "Hello Worldn";
}
Eski alışkanlıklarınızı C ++ 23'te açmalısınız. “Merhaba Dünya” programı şimdi şöyle görünüyor:
import std;
int main() {
std:
}
Programı analiz etmek istiyorum.
Standart Modüler Kitaplık
C ++ 23, modüler bir standart kütüphaneyi destekler. Basit komutla import std; Standart kütüphanenin tamamı emrinizde. Ayrıca Clobal C gibi işlevler yaparsanız printf kullanmak istiyorsun, yapmalısın import std.compat; kullanmak. İşte ilgili “merhaba dünya” programı printf:
import std.compat;
int main() {
printf("Hello Worldn");
}
Standart modüler kütüphanenin iki önemli gelişimi vardır: önemli ölçüde iyileştirilmiş derleme süresi ve kullanılabilirlik.
Önemli iyileştirme süresi süresi
Standart kütüphanenin içe aktarılması (import std) kelimenin tam anlamıyla “ücretsiz”. Bu, derleme sürelerinin önemli ölçüde azaldığı anlamına gelir. İlk deneyim, derleme sürelerinin en az bir faktör 10 olduğunu göstermektedir. Bu gelişmenin nedeni açıktır. Başlık dosyalarını kademeli olarak eklemek yerine bir form içe aktarın. Bu yüzden tüm standart C ++ 23 kütüphanesini içeren tek bir form var. Şimdiye kadar, yalnızca MSVC derleyicisi bu standart modüler kütüphaneyi destekledi: Eğitim: Standart C ++ kitaplığı, komut satırından modülü kullanarak önemlidir.
Kullanılabilirliğin iyileştirilmesi
Diyelim ki işlevi istiyoruz std::accumulate kullanmak. Hangi başlık dosyasını eklemeniz gerektiğini biliyor musunuz? Başlık dosyasınumeric>,functional> veyaalgorithm>? Belki senin için çok kolaydı. Şimdi göründüğü gibi std::forward Aşağıdaki program neden veya neden tamamlanamıyor?
int main() {
auto list = {1, 2, 3, 4};
}
İfade {1, 2, 3, 4} bir std::initializer_list<int>. Onları kullanmak için başlıkinitializer_list> Kullanılabilir. Tabii ki, bir kap göründüğünde bu başlık otomatik olarak entegre edilir std::vector Kullanılır.
Önceki örnekleri basit bir şekilde karşılaştırın import std; VEYA import std::compat;. Deneyimlerime göre biliyorum: Yeni başlayanlar sadece doğru başlık dosyalarını kullanırken başarısız olmakla kalmaz.
Bunu fark edip etmediğinizi bilmiyorum, ama C ++ 23- “Merhaba Dünya” programım C ++ 23'ün ikinci bir özelliğini kullandı:
std:
C ++ 23, her iki işlev için iki aşırı yük sunar:
std:
template< class... Args >
void print( std::FILE* stream,
std::format_string<Args...> fmt, Args&&... args );
template< class... Args >
void print( std::format_string<Args...> fmt, Args&&... args );
std:
template< class... Args >
void println( std::FILE* stream,
std::format_string<Args...> fmt, Args&&... args );
template< class... Args >
void println( std::format_string<Args...> fmt, Args&&... args );
Arasındaki ilk fark std:
Çeşitli Model
std:
import std;
int main() {
// std:
std::cout << std::format("{:}n", "Hello World");
}
Mükemmel inholy'den en çeşitli modele sahipseniz ve std::formaBilmek istiyorum, en eski makalelerimi oku:
Unicode desteği
O std:
Başka bir sorun, Unicode metninin biçimlendirilmesidir:
std::cout << "Привет, κόσμος!";
Menşe ve yürütme kodlaması UTF-8 ise, bu, GNU/Linux ve macOS üzerinde beklenen çıktıyı üretecektir. Gayri resmi olarak pencerelerde, sistemin Unicode'u tamamen yazdırabilmesine rağmen Mojibake üretilmesi neredeyse garantilidir.
Привет κόσμος!
Visual C ++ kullanılarak /UTF-8 ile tamamlanmış olsa bile ([MSVC-UTF8]). Bunun nedeni, terminalin yürütme kodlamasına bakılmaksızın bu durumda 437 kodunu varsaymasıdır.
Önerilen kartla
std:
“П п, κόσμος!” Programcıların standart yapıları kullanarak akışta bir metin tek kodu yazmasına izin vermesi beklendiği gibi.
Herhangi bir çıktı akımı
Her iki varyant std:
std::format Ve bu nedenle std:
Bir konteynerin biçimlendirilmiş sürümü
Aşağıdaki program, doğrudan bir STL kabı üretmenin nasıl mümkün olduğunu göstermektedir. Şimdiye kadar, hiçbir C ++ derleyicisi bu işlevi desteklemedi. Sadece yepyeni klan derleyicisi libc++ Bunun yerine libstdc++ Bu işlevi en azından kısmen kullanmanıza izin verir. Tamamen uyumlu bir C ++ 23 uygulamasında yapabilirim std:
// formatVector.cpp
#include <format>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<int> myInts{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << std::format("{:}n", myInts);
std::cout << std::format("{::+}n", myInts);
std::cout << std::format("{::02x}n", myInts);
std::cout << std::format("{::b}n", myInts);
std::cout << 'n';
std::vector<std::string> myStrings{"Only", "for", "testing", "purpose"};
std::cout << std::format("{:}n", myStrings);
std::cout << std::format("{::.3}n", myStrings);
}
Bu örnekte bir tane kullanıyorum std::vector<int> ve bir std::vector<std::string>. Eğer {:} Her iki kap (1 ve 2) doğrudan yer tutucu olarak görüntülenir. İki Çift Puan Olun {::} yer tutucu içinde kullanılır, std::vector format. Spesifik format ikinci kolonu takip eder.
- std::vector<int>: Vektör öğelerinin bir işareti vardır. {::+}Doldurma işareti olarak 0 ile 2 karakter üzerinde onaltılık. {::02x} hizalanmış ve sunuldu ikili {::b}.
- std::vector<std::string>: Her dize ilk 3 karakterine kısaltılır: {::.3}.

Sırada ne var?
C ++ 23'te geliştirilen standart kütüphane hakkındaki bir sonraki makalemde, std:
(harita)