C ++ 26 Çekirdek Dil: Küçük Gelişmeler

Adanali

Active member
C ++ 26 Çekirdek Dil: Küçük Gelişmeler


  1. C ++ 26 Çekirdek Dil: Küçük Gelişmeler

C ++ 26 için, bazı makalelerde sunduğum büyük yansıma ve sözleşmelere ek olarak, bazı daha küçük ve kullanışlı eklemeler de sağlanmaktadır.








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.







Geçen hafta zaten alan ve genişletilmiş karakter sahiplerinin setini gösterdim ve bu sefer C ++ standardına ek eklemeler.








static_assert Genleşme


Her şeyden önce, sözdizimi static_assert C ++ 11'de:


static_assert(compile time predicate, unevaluated string)


C ++ 26'da dize, aşağıdaki özelliklere sahip kişiselleştirilmiş bir veri türü olabilir:

  • Var size() Tam numaraya ürettiği yöntem
  • Var data() Karakter türünün bir işaretçisini üreten yöntem
  • Öğeler hizalamak [data(), data()+size()) are valid. (p2741r3)
static_assert kann jetzt mit einem Formatierungsstring verwendet werden. Hier ist ein schönes Beispiel aus dem Proposal p2741r3. Ich habe daraus ein komplettes Programm gemacht.


// static_assert26.cpp

#include <iostream>
#include <format>

template <typename T, auto Expected, unsigned long Size = sizeof(T)>
constexpr bool ensure_size() {
static_assert(sizeof(T) == Expected, "Unexpected sizeof");
return true;
}

struct S {
int _{};
};

int main() {

std::cout << std::boolalpha << "C++11n";
static_assert(ensure_size<S, 1>());

std::cout << std::boolalpha << "C++26n";
static_assert(sizeof(S) == 1,
std::format("Unexpected sizeof: expected 1, got {}", sizeof(S)));

std::cout << 'n';

}


Das Template ensure_size ist so definiert, dass es drei Parameter akzeptiert: einen Datentyp T, eine erwartete Größe Expected und einen optionalen Parameter Size, der standardmäßig der Größe von T entspricht. Innerhalb der Funktion überprüft eine static_assert-Anweisung, ob die Größe von T gleich Expected ist. Wenn die Größen nicht übereinstimmen, schlägt die Kompilierung mit der Meldung Unexpected sizeof fehl. Die Funktion gibt true zurück, wenn die Zusicherung erfüllt ist.

Das Programm definiert dann eine einfache Struktur S, die ein einzelnes Integer-Element _ enthält. Diese Struktur wird verwendet, um die static_assert-Funktionalität zu demonstrieren.

In der main-Funktion gibt das Programm zunächst C++11 mit std::boolalpha in der Konsole aus, um boolesche Werte als true oder false zu formatieren. Anschließend wird static_assert mit aufgerufen, wodurch überprüft wird, ob die Größe von S 1 Byte beträgt. Da die Größe von S tatsächlich größer als 1 Byte ist, schlägt diese Zusicherung fehl und führt zu einem Kompilierungsfehler.

Als Nächstes gibt das Programm C++26 in der Konsole aus und verwendet eine weitere static_assert. Dieses Mal kommt std::format zum Einsatz. Wenn die Größe von S nicht 1 Byte, sondern 4 beträgt, schlägt die Kompilierung fehl.








Der Blick auf die GCC-Fehlermeldungen zeigt drei Fehler. std::format ist bisher nicht constexpr.

Pack-Indizierung


Die Pack-Indizierung ist wohl die Lieblings-Template-Verbesserung für die Freunde der Template-Metaprogrammierung.

Das folgende Beispiel basiert auf dem Proposal P2662R3.


// packIndexing.cpp

#include <iostream>
#include <string>

template <typename... T>
constexpr auto first_plus_last(T... values) -> T...[0] {Dönüş t ...[0](Değerler ...[0] + Değerler ...[sizeof...(values)-1]); } int main () {std :: cout code>


Sağlanan örnek, bir parametre paketinin ilk ve son öğesinin toplamını hesaplayan fonksiyonel bir modeldir.

Fonksiyon, herhangi bir veri türünün değişken sayıda parametresini kabul eden bir model olarak tanımlanır.

Fonksiyonel gövde, parametre paketinin ilk ve son öğesinin toplamını döndürür. İfade values...[0] İlk elemanı alın e values...[sizeof...(values)-1] Son öğeye erişir.

İşte programın baskısı:








delete akıl ile


C ++ 26 ile bir nedeniniz olabilir delete belirtmek. Bunun en iyi uygulama olarak geçerli olacağını varsayıyorum. Aşağıdaki program prosedürü göstermelidir.


// deleteReason.cpp

#include <iostream>


void func(double){}

template <typename T>
void func(T) = delete("Only for double");

int main(){

std::cout << 'n';

func(3.14);
func(3.14f);

std::cout << 'n';

}








İşlev func İki şekilde aşırı yüklenir. İlk aşırı yük, düzenli bir işlevdir double parametre olarak kullanılır. Bu işlev, bir sorun olmadan gerçekleştirilebilir doubleKonu denir.

İkinci aşırı yük, her türlü veriyi parametre olarak kullanabilen bir modeldir. Ancak, bu işlev açıkça = deleteKişiselleştirilmiş mesajla görevli "Only for double"Silindi. Bu, her bir örneğin dışında bir tür veri ile double Bir derleme hatası görüntülenir ve sağlanan mesaj görüntülenir.

İçinde main-Function programı çağırıyor func Konuyla 3.14 Bu, double VE. Bu çağrı geçerlidir ve zamanlamayan aşırı yükü çağırır. func AÇIK.

Daha sonra, program bize dener func Konuyla 3.14f BURA float VE. Taze olmayan aşırı yük olmadığı için func Bir tane vermek float Kabul edilen, model işlevi somutlaştırılacaktır. Ancak, her türlü veri türü için model işlevi double Silindi, bu çağrı mesajla derleme hatasına yol açıyor "Only for double".

Sırada ne var?


Bir sonraki makalemde C ++ 26 Bookshop'a gideceğim.


(RME)
 
Üst