C ++ 26'ya genel bir bakış: Kütüphane

Adanali

Active member
C ++ 26'ya genel bir bakış: Kütüphane


  1. C ++ 26'ya genel bir bakış: Kütüphane

C ++ 26'nın temel dili hakkındaki açıklamalarımda daha önce çizildiği gibi, C ++ 26'nın meyve tasarımı sadece 2025'in ilk çeyreğinde gerçekleşeceğinden, sadece kütüphanenin ilk izlenimini verebilirim. Kod sınavları hala tekliflerden geliyor.








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.













std::string- VE std::string_view-işleme


Etraftaki işlevler std::string VE std::string_view Bu işlevleri rahatça daha rahat kullanın.

Başarı veya hata testicharconv> -CARS işlevleri


İşlevleri kullanın to_chars VEYA from_chars Şimdiye kadar oldukça hantaldı. İle gitmelisin res.ec == std::errc{} Dönüşümün başarısını kontrol edin. C ++ 26 ile sonuç izlenebilir bool dönüştürmek.

Aritmetik aşırı yük std::to_string ve kullanımı std::format


std::to_string Bazı sorunlar doğur: “Mobil sivri format seçimi, std :: to_string'i uygulamada çok sınırlı kullanımı yaparVe “(Teklif P2587R3 yayınlandı).


auto loc = std::locale("uk_UA.UTF-8");
std::locale::global(loc);
std::cout.imbue(loc);
setlocale(LC_ALL, "C");

std::cout << "iostreams:n";&#13;
std::cout << 1234 << "n";&#13;
std::cout << 1234.5 << "n";&#13;
&#13;
std::cout << "nto_string:n";&#13;
std::cout << std::to_string(1234) << "n";&#13;
std::cout << std::to_string(1234.5) << "n";&#13;
&#13;
setlocale(LC_ALL, "uk_UA.UTF-8");&#13;
&#13;
std::cout << "nto_string (uk_UA.UTF-8 C locale):n";&#13;
std::cout << std::to_string(1234) << "n";&#13;
std::cout << std::to_string(1234.5) << "n";


Önceki listedeki program, Iostames için Lubrica aşırı yüklerinin çıktısının tutarsız olduğunu göstermektedir. Küresel C çubuğundan ondalık noktayı alıyor.

Dizelerin akışlarının bağlantısı std::string_view


P2495R3 teklifi sayesinde, bir std::string_view yaratılacak. Aşağıdaki örnekte ""sv Kaçınmak string_view-Literal.


// implicitly convertable to string_view&#13;
const mystring str;&#13;
&#13;
stringstream s1(""sv);&#13;
stringstream s1(str);&#13;
s2.str(""sv);


Dize dizelerinin ve görünümlerinin metinasyonu


C ++ 26 ile dizenin dizeleri ve görünümleri zincirlenebilir.


std::string calculate(std::string_view prefix)&#13;
{&#13;
return prefix + get_string(); // NO ERROR&#13;
}


Format uzantıları

İşaretçi


C ++ 26'dan önceki en eski C ++ sürümlerinde sadece veri türleri void,, const void VE std::nullptr_t geçerli. Herhangi bir işaretçinin adresi sunulması gerekiyorsa, std::string calculate(std::string_view prefix) { return prefix + get_string(); // NO ERROR } dönüştürülebilir.


double d = 123.456789;&#13;
std::format("{}", &d); // ERROR&#13;
std::format("{}", static_cast<void*>(&d)); // okay&#13;
std::format("{}", static_cast<const void*>(&d)); // okay&#13;
std::format("{}", nullptr); // okay&#13;



C ++ 26 ile hata mesajları kaybolur.


// pointerFormat.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
double d = 123.456789;&#13;
&#13;
std::cout << std::format("{}", static_cast<void*>(&d)) << 'n';&#13;
std::cout << std::format("{}", static_cast<const void*>(&d)) << 'n';&#13;
std::cout << std::format("{}", nullptr) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Bu nedenle program çıktısı şuna benziyor:








std::filesystem::path


std::format Şekerler std::filesystem::path-Show nesneleri -P2845r8 teklifinden bir örnek olarak şunları gösteriyor:


auto p1 = std::filesystem::path("/usr/bin");
Ja std::cout << std::format("{}", p1); // /usr/bin


auto p2 = std::filesystem::path("multinline");
std::cout << std::format("{}", p2); // multi
// line


auto p3 = std::filesystem::path("multinline");
std::cout << std::format("{:?}", p3); // "multinline"



Biçim dizisi sayesinde "{:?}" Son satırda kaçış dizisi "n" yorumlanmadı.

std::inplace_vector


std::inplace_vector P0843R8 teklifine göre, “öğelerin vektör nesnesi içinde saklandığı derleme dönemi ve tutarlı bellek dahil olmak üzere bir kapasiteye sahip dinamik olarak uyarlanabilir bir vektör” (“Sabit derleme süresine sahip dinamik olarak asi bir taşıyıcı ve elemanların vektör nesnesinin kendisi ile depolandığı bitişik bellek dahil“).

Bu konteyner, std::vector kullanılabilir. Ama ne zaman yapmalı inplace_vector VEYA vector Kullanıyorlar mı?

P0843R8 teklifine bir bakış:

  • Depolama ataması mümkün değildir, ör. B. Yalnızca bir yığın ve statik bellek segmentinin bulunduğu ücretsiz belleği olmayan inşa edilmiş ortamlarda.
  • Belleğin atanması, hizmetlerin kabul edilemez bir değeridir, ör. B. gecikme açısından,
  • Statik bellek segmentinde karmaşık süreli nesnelerin atanması gereklidir,
  • std::array Bu bir seçenek değil, ör. B. Standart yapılı nesneler kaydedilmemelise
  • İçinde dinamik olarak ayarlanabilir bir dizi constexpr-gerekli
  • depolama konumuna borçludur inplace_vector-içindeki elemanlar inplace_vector-Bjektler kendileridir (örneğin memcpy serileştirme amacıyla).
Rütbenin iyileştirilmesi


Ranges kitapçısı yeni işlevler alır: std::ranges::generate_random VE std::ranges::concat_view.

Arama std::ranges::generate_random(fltArray, g, d) Jeneratörü kullanın g Ve dağıtım dRastgele sayılar oluşturmak için. Çağrı aşağıdaki döngü ile eş anlamlıdır:


for(auto& el : fltArray)&#13;
el = d(e);&#13;



constexpr-Uzatma


C ++ 11 tarafından devam eden bir eğilim: C ++ 'da gittikçe daha fazla işlevsel çağrı yapıldı constexpr.

  • std::stable_sort, std::stable partition VE std::inplace_merge C ++ 26'dayım constexpr. Bu, aralık aralığındaki meslektaşlarınız için de geçerlidir.
  • P1383R2 teklifi şöyle açıklıyor: “Bu teklif, bir (daha ileri) bir (daha fazla), bir heyelan ile birlikte “.
Sırada ne var?


Bir sonraki yazımda C ++ 26'daki kütüphanede yolculuğuma devam ediyorum.


(harita)
 
Üst