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:
// format.cpp
#include <format>
#include <iostream>
#include <iterator>
#include <string>
int main() {
std::cout << 'n';
std::cout << std::format("Hello, C++{}!n", "20")
<< 'n'; // (1)
std::string buffer;
std::format_to( // (2)
std::back_inserter(buffer),
"Hello, C++{}!n",
"20");
std::cout << buffer << 'n';
buffer.clear();
std::format_to_n( // (3)
std::back_inserter(buffer), 5,
"Hello, C++{}!n",
"20");
std::cout << buffer << 'n';
std::cout << 'n';
}
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
#include <format>
#include <iostream>
#include <iterator>
#include <string>
int main() {
std::cout << 'n';
std::string formatString = "Hello, C++{}!n";
std::cout << std::vformat(formatString,
std::make_format_args("20"))
<< 'n'; // (1)
std::string buffer;
std::vformat_to( // (2)
std::back_inserter(buffer),
formatString,
std::make_format_args("20"));
std::cout << buffer << 'n';
}
. 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.
std::formatter Ve uzmanlıkları, argüman türleri için formatın spesifikasyonunu tanımlar.
Derleme süresi
Bir sonraki blog makalesinde teoriyi uygulama ile tamamlayacağım.
(RME)
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)).
// format.cpp
#include <format>
#include <iostream>
#include <iterator>
#include <string>
int main() {
std::cout << 'n';
std::cout << std::format("Hello, C++{}!n", "20")
<< 'n'; // (1)
std::string buffer;
std::format_to( // (2)
std::back_inserter(buffer),
"Hello, C++{}!n",
"20");
std::cout << buffer << 'n';
buffer.clear();
std::format_to_n( // (3)
std::back_inserter(buffer), 5,
"Hello, C++{}!n",
"20");
std::cout << buffer << 'n';
std::cout << 'n';
}
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
#include <format>
#include <iostream>
#include <iterator>
#include <string>
int main() {
std::cout << 'n';
std::string formatString = "Hello, C++{}!n";
std::cout << std::vformat(formatString,
std::make_format_args("20"))
<< 'n'; // (1)
std::string buffer;
std::vformat_to( // (2)
std::back_inserter(buffer),
formatString,
std::make_format_args("20"));
std::cout << buffer << 'n';
}
. 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)
- Sıradan işaretler ({e} hariç),
- {E} ile değiştirilen kaçış dizileri {e}}
- Yedek alanlar.
- 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.
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.
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.
Bir sonraki blog makalesinde teoriyi uygulama ile tamamlayacağım.
(RME)