Yazılım Geliştirme: C ++ 20'de biçimlendirme kitaplığı

Adanali

Active member
Yazılım Geliştirme: C ++ 20'de biçimlendirme kitaplığı


  1. Yazılım Geliştirme: C ++ 20'de biçimlendirme kitaplığı

Peter Gottschling, C ++ 20'deki biçimlendirme kütüphanesi hakkında iki büyük blog makalesi yazsa da (“C ++ 20'de Format”, “C ++ 20: Std :: Kullanıcı tarafından tanımlanan veri türlerini genişletmek için format”), biçimlendirme kitaplığı aracılığıyla tekrar yazacağım. Bunun nedeni basit: Peters'ın makalesi harika bir giriş ve panoramik verdi. Herkesin bunu ve sonraki makaleleri referans çalışması olarak kullanabilmesi için tüm ayrıntıları tanıtmak istiyorum.










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.













C ++ 20 aşağıdaki biçimlendirme işlevlerini destekler:








İşlevler std::format VE std::format_to işlevsel olarak meslektaşlarına eşdeğerdirler std::vformat VE std::vformat_toAma bazı yerlerde farklılık gösteriyorlar:

  • std::format, std::_format_to VE std::format_to_n: Derleme süresi boyunca format halkası olarak bir değere ihtiyacınız var. Bu biçim dizesi bir constexpr-Tring veya gerçek bir dize.
  • std::vformat VE std::vformat_t: Biçim dizesi bir lValue olabilir. Konular çeşitli işlevle ilgili olmalıdır std::make_format_args Örneğin, teslim olun: std::vformat(formatString, std::make_format_args(args)).
Biçimlendirme işlevleri herhangi bir sayıda konuyu kabul eder. Aşağıdaki program, işlevler hakkında ilk izlenim veriyor std::format,, std::format_to VE std::format_to_n.




// format.cpp

#include <format>&#13;
#include <iostream>&#13;
#include <iterator>&#13;
#include <string>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << std::format("Hello, C++{}!n", "20") &#13;
<< 'n'; // (1)&#13;
&#13;
std::string buffer;&#13;
&#13;
std::format_to( // (2)&#13;
std::back_inserter(buffer), &#13;
"Hello, C++{}!n", &#13;
"20"); &#13;
&#13;
std::cout << buffer << 'n';&#13;
&#13;
buffer.clear(); &#13;
&#13;
std::format_to_n( // (3)&#13;
std::back_inserter(buffer), 5, &#13;
"Hello, C++{}!n", &#13;
"20"); &#13;
&#13;
std::cout << buffer << 'n';&#13;
&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Program, (1) 'de biçimlendirilmiş dizeyi gösterir. Ancak, (2) ve (3) 'deki görünümler, arabellek gibi bir dize kullanır. Çok iter std::format_to_n Tamponda sadece beş karakter.








İşte ilgili program std::vformat VE std::vformat_n kullanılmış:


// formatRuntime.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
#include <iterator>&#13;
#include <string>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::string formatString = "Hello, C++{}!n";&#13;
&#13;
std::cout << std::vformat(formatString, &#13;
std::make_format_args("20"))&#13;
<< 'n'; // (1)&#13;
&#13;
std::string buffer;&#13;
&#13;
std::vformat_to( // (2)&#13;
std::back_inserter(buffer), &#13;
formatString, &#13;
std::make_format_args("20")); &#13;
&#13;
std::cout << buffer << 'n';&#13;
&#13;
}


. formatString (1) ve (2) 'de bir lvalue vardır.








Muhtemelen format dizesinin biçimlendirme işlevlerinin en heyecan verici kısmı ("Hallo, C++{}!n").

Formatta dize


Biçim halkasının sözdizimi biçimlendirme işlevlerinde std::format, std::format_to, std::format_to_n, std::vformat VE std::vformat_to birebir aynı. Kullanmak std::format Örneklerimde.

  • Sözdizimi: Std :: Biçim (Biçim Halkası, Args)
Biçim halkası FormatString oluşur

  • Sıradan işaretler ({e} hariç),
  • {E} ile değiştirilen kaçış dizileri {e}}
  • Yedek alanlar.
{} Biçimi bir yedek aralığı vardır.

  • Değiştirme alanının içinde bir kimlik konusu ve kolon kullanabilirsiniz, ardından formatın bir göstergesi. Her iki bileşen de isteğe bağlıdır.
Kimlik konusu ile konu dizini Args belirtmek. Kimlik 0'dan başlar. Belirli bir konu yoksa, alanlar konuların belirtildiği sırayla tamamlanır. Veya tüm yedek alanların bir kimlik konusu kullanması veya hiçbiri kullanmamalıdır; Bu şu anlama gelir std::format("{}, {}", "Hallo", "Welt") VE std::format("{1}, {0}", "Welt", "Hallo") İkisi de derlenir, ama std::format("{1}, {}", "Welt", "Hallo") Olumsuz.

std::formatter Ve uzmanlıkları, argüman türleri için formatın spesifikasyonunu tanımlar.

  • Temel veri türleri e std::string: Python formatının spesifikasyonuna dayanarak.
  • Chrono türleri: Onları bir sonraki makaleden birinde sunuyorum.
  • Diğer şekillendirilebilir veri türleri: Özelleştirilmiş std::formatter-Kalizasyon. Sizi ek bir makaleyle tanıştıracağım.
Format halkalarının bir derleme değişkeni olması iki ilginç sonucu vardır: performans ve güvenlik.

Derleme süresi

  • Performans: Biçim dizesi derleme sırasında kontrol edilirse, sonunda hiçbir şey yapmak gerekli değildir. Sonuç olarak, üç işlev vaat ediyor std::format, std::format_to VE std::format_to_n Mükemmel performans. FMT prototip kütüphanesinin heyecan verici bir ölçütü var.
  • Güvenlik: Derleme döneminde yanlış formatta bir halka kullanımı bir derleme hatasına yol açar. Aksine, bir çalışma zamanı -Door format halkasının kullanımı std::vformat VEYA std::vformat_to A std::format_error-İstisna.
Sırada ne var?


Bir sonraki blog makalesinde teoriyi uygulama ile tamamlayacağım.


(RME)
 
Üst