C ++ 20'de kişiselleştirilmiş veri türlerini biçimlendirmek için daha fazla ayrıntı
Bu makale, C ++ 20'de biçimlendirme konusundaki mini serimin beşinci. İşte önceki katkılar:
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.
Farklı değerler için bir biçim
Point Üç üyeli bir sınıftır.
// formatPoint.cpp
#include <format>
#include <iostream>
#include <string>
struct Point {
int x{2017};
int y{2020};
int z{2023};
};
template <>
struct std::formatter<Point> : std::formatter<std::string> {
auto format(Point point, format_context& context) const {
return formatter<string>::format(
std::format("({}, {}, {})",
point.x, point.y, point.y), context);
}
};
int main() {
std::cout << 'n';
Point point;
std::cout << std::format("{:*<25}", point) << 'n'; // (1)
std::cout << std::format("{:*^25}", point) << 'n'; // (2)
std::cout << std::format("{:*>25}", point) << 'n'; // (3)
std::cout << 'n';
std::cout << std::format("{} {} {}", point.x, point.y, point.z)
<< 'n'; // (4)
std::cout << std::format("{0:*<10} {0:*^10} {0:*>10}", point.x)
<< 'n'; // (5)
std::cout << 'n';
}
Bu durumda, standart formatı yönlendiriyorum std::formatter<std::string> mesafe. A std::string_view Ayrıca mümkündür. std::formatter<Point> Biçimini arayarak biçimlendirilmiş sürümü oluşturun std::formatter. Bu işlev çağrısı zaten bir değer olarak biçimlendirilmiş bir dize alır. Sonuç olarak, formatının tüm özellikleri std::string uygulanabilir (1 – 3). Aksine, her değeri Point format. (4) ve (5) 'de tam olarak olan budur.
uluslararlaştırma
Biçimlendirme işlevleri std::format* VE std::vformat* Yerlileri de kabul eden aşırı yükleri var. Bu aşırı yüklerle bir biçimlendirme dizesi bulunabilir.
Aşağıdaki kod parçası, std::format:
template< class... Args >
std::string format( const std::locale& loc,
std::format_string<Args...> fmt,
Args&&... args );
Belli bir yer kullanmak için hadi L Biçim halkasındaki veri türünden önce. Şimdi her aradığınızda yeri çevirin std::format veya küresel olarak koy std::locale::global.
Aşağıdaki örnekte herkese dönüyorum std::format-Açıkça Alman Yeri'ni arayın.
// internationalization.cpp
#include <chrono>
#include <exception>
#include <iostream>
#include <thread>
std::locale createLocale(const std::string& localString) { // (1)
try {
return std::locale{localString};
}
catch (const std::exception& e) {
return std::locale{""};
}
}
int main() {
std::cout << 'n';
using namespace std::literals;
std::locale loc = createLocale("de_DE");
std::cout << "Default locale: " << std::format("{:}", 2023)
<< 'n';
std::cout << "German locale: "
<< std::format(loc, "{:L}", 2023) << 'n'; // (2)
std::cout << 'n';
std::cout << "Default locale: " << std::format("{:}", 2023.05)
<< 'n';
std::cout << "German locale: "
<< std::format(loc, "{:L}", 2023.05) << 'n'; // (3)
std::cout << 'n';
auto start = std::chrono::steady_clock::now();
std::this_thread::sleep_for(33ms);
auto end = std::chrono::steady_clock::now();
const auto duration = end - start;
std::cout << "Default locale: "
<< std::format("{:}", duration) << 'n';
std::cout << "German locale: "
<< std::format(loc, "{:L}", duration) << 'n'; // (4)
std::cout << 'n';
const auto now = std::chrono::system_clock::now();
std::cout << "Default locale: " << std::format("{}n", now);
std::cout << "German locale: "
<< std::format(loc, "{:L}n", now); // (5)
std::cout << 'n';
}
İşlev createLocale (1) Alman yeri yaratın. Bu başarısız olursa, Amerikan biçimlendirmesini kullanan standart odayı döndürür. (2), (3), (4) ve (5) 'de Alman yerel kullanıyorum. Farkı görmek için ben de var std::format-CREPF hemen uygulandı. Sonuç olarak, konuma bağlı binlerce ayrılma işareti, tüm değer (2) ve konuma bağlı ondalık noktaya ve akış kombinasyonu değeri (3) için bin ayrılık belirtisi için kullanılır. Sonuç olarak, zaman (4) ve zaman (5) süresi, belirtilen Alman alanının şemasını kullanır.
Aşağıdaki ekran görüntüsü programın baskısını göstermektedir.
Sırada ne var?
std::formatter Ve uzmanlıkları ayrıca Chrono kütüphanesinin veri türleri için formatın özelliklerini tanımlar. Senin hakkında yazmadan önce, C ++ 20'nin Chrono uzantısında daha derin olacağım.
(RME)
C ++ 20'de kişiselleştirilmiş veri türlerini biçimlendirmek için daha fazla ayrıntı
Bu makale, C ++ 20'de biçimlendirme konusundaki mini serimin beşinci. İşte önceki katkılar:

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.

Farklı değerler için bir biçim
Point Üç üyeli bir sınıftır.
// formatPoint.cpp
#include <format>
#include <iostream>
#include <string>
struct Point {
int x{2017};
int y{2020};
int z{2023};
};
template <>
struct std::formatter<Point> : std::formatter<std::string> {
auto format(Point point, format_context& context) const {
return formatter<string>::format(
std::format("({}, {}, {})",
point.x, point.y, point.y), context);
}
};
int main() {
std::cout << 'n';
Point point;
std::cout << std::format("{:*<25}", point) << 'n'; // (1)
std::cout << std::format("{:*^25}", point) << 'n'; // (2)
std::cout << std::format("{:*>25}", point) << 'n'; // (3)
std::cout << 'n';
std::cout << std::format("{} {} {}", point.x, point.y, point.z)
<< 'n'; // (4)
std::cout << std::format("{0:*<10} {0:*^10} {0:*>10}", point.x)
<< 'n'; // (5)
std::cout << 'n';
}
Bu durumda, standart formatı yönlendiriyorum std::formatter<std::string> mesafe. A std::string_view Ayrıca mümkündür. std::formatter<Point> Biçimini arayarak biçimlendirilmiş sürümü oluşturun std::formatter. Bu işlev çağrısı zaten bir değer olarak biçimlendirilmiş bir dize alır. Sonuç olarak, formatının tüm özellikleri std::string uygulanabilir (1 – 3). Aksine, her değeri Point format. (4) ve (5) 'de tam olarak olan budur.

uluslararlaştırma
Biçimlendirme işlevleri std::format* VE std::vformat* Yerlileri de kabul eden aşırı yükleri var. Bu aşırı yüklerle bir biçimlendirme dizesi bulunabilir.
Aşağıdaki kod parçası, std::format:
template< class... Args >
std::string format( const std::locale& loc,
std::format_string<Args...> fmt,
Args&&... args );
Belli bir yer kullanmak için hadi L Biçim halkasındaki veri türünden önce. Şimdi her aradığınızda yeri çevirin std::format veya küresel olarak koy std::locale::global.
Aşağıdaki örnekte herkese dönüyorum std::format-Açıkça Alman Yeri'ni arayın.
// internationalization.cpp
#include <chrono>
#include <exception>
#include <iostream>
#include <thread>
std::locale createLocale(const std::string& localString) { // (1)
try {
return std::locale{localString};
}
catch (const std::exception& e) {
return std::locale{""};
}
}
int main() {
std::cout << 'n';
using namespace std::literals;
std::locale loc = createLocale("de_DE");
std::cout << "Default locale: " << std::format("{:}", 2023)
<< 'n';
std::cout << "German locale: "
<< std::format(loc, "{:L}", 2023) << 'n'; // (2)
std::cout << 'n';
std::cout << "Default locale: " << std::format("{:}", 2023.05)
<< 'n';
std::cout << "German locale: "
<< std::format(loc, "{:L}", 2023.05) << 'n'; // (3)
std::cout << 'n';
auto start = std::chrono::steady_clock::now();
std::this_thread::sleep_for(33ms);
auto end = std::chrono::steady_clock::now();
const auto duration = end - start;
std::cout << "Default locale: "
<< std::format("{:}", duration) << 'n';
std::cout << "German locale: "
<< std::format(loc, "{:L}", duration) << 'n'; // (4)
std::cout << 'n';
const auto now = std::chrono::system_clock::now();
std::cout << "Default locale: " << std::format("{}n", now);
std::cout << "German locale: "
<< std::format(loc, "{:L}n", now); // (5)
std::cout << 'n';
}
İşlev createLocale (1) Alman yeri yaratın. Bu başarısız olursa, Amerikan biçimlendirmesini kullanan standart odayı döndürür. (2), (3), (4) ve (5) 'de Alman yerel kullanıyorum. Farkı görmek için ben de var std::format-CREPF hemen uygulandı. Sonuç olarak, konuma bağlı binlerce ayrılma işareti, tüm değer (2) ve konuma bağlı ondalık noktaya ve akış kombinasyonu değeri (3) için bin ayrılık belirtisi için kullanılır. Sonuç olarak, zaman (4) ve zaman (5) süresi, belirtilen Alman alanının şemasını kullanır.
Aşağıdaki ekran görüntüsü programın baskısını göstermektedir.

Sırada ne var?
std::formatter Ve uzmanlıkları ayrıca Chrono kütüphanesinin veri türleri için formatın özelliklerini tanımlar. Senin hakkında yazmadan önce, C ++ 20'nin Chrono uzantısında daha derin olacağım.
(RME)