C++26'ya genel bakış: temel dil

Adanali

Active member
C++26'ya genel bakış: temel dil


  1. C++26'ya genel bakış: temel dil

Bu görüntü, C++26'nın nasıl yapılandırıldığına dair ilk izlenimi sağlar.


Duyuru



















Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.







Bulanık sularda balık tutmak


Görüntünün yalnızca C++26'nın neye benzediğine dair ilk izlenimi vermesi amaçlanmaktadır. Önümüzdeki birkaç ay boyunca C++26 hakkında yazarken bunu gerektiği gibi uyarlayacağım. Örneğin, üç güçlü özellik; Yansıma, Sözleşmeler ve std::execution standardizasyonuna doğru büyük bir adım attılar. Bunun yerine, görüntüdeki desen eşleşmesini kasıtlı olarak görmezden geliyorum.

Yansıma veya sözleşmeler gibi çok etkili özellikler, minimum uygulanabilir ürün çevik fikrini hayata geçirir:

“Minimum Uygulanabilir Ürün (MVP), bir ürünün ilk müşteriler tarafından kullanılabilecek yeterli işlevselliğe sahip olan ve daha sonra gelecekteki ürün geliştirme için geri bildirim sağlayabilen bir versiyonudur.”

Bu, C++26'nın yansıma veya sözleşmeler gibi özellikler için yalnızca başlangıç noktası olduğu anlamına gelir. Mümkünse özellikleri çalışırken gösteriyorum. Pek çok özellik en yeni C++ derleyicilerinde zaten uygulanmıştır. Geri kalanı için prototip uygulamalarını umuyorum.

Ana dille başlayacağım.

Temel dil


Refleks

Yansıma, bir programın kendi yapısını ve davranışını inceleme, dikkate alma ve değiştirme yeteneğidir. Bu, C++'ta derleme zamanı programlamayı çok daha güçlü hale getirir. Bu yazıda sizi fazla teoriyle sıkmak istemiyorum. Bu yüzden size P2996R5 yansıma teklifinden en sevdiğim örneği göstereceğim.

Derslerimde sıklıkla yanıtlamak zorunda kaldığım bir soru şudur: Bir numaralandırıcıyı nasıl dizeye dönüştürebilirim?


// enumString.cpp

#include <iostream>&#13;
#include <experimental/meta>&#13;
#include <string>&#13;
#include <type_traits>&#13;
&#13;
// start 'expand' definition&#13;
namespace __impl {&#13;
template<auto... vals>&#13;
struct replicator_type {&#13;
template<typename F>&#13;
constexpr void operator>>(F body) const {&#13;
(body.template operator()<vals>(), ...);&#13;
}&#13;
};&#13;
&#13;
template<auto... vals>&#13;
replicator_type<vals...> replicator = {};&#13;
}&#13;
&#13;
template<typename R>&#13;
consteval auto expand(R range) {&#13;
std::vector<std::meta::info> args;&#13;
for (auto r : range) {&#13;
args.push_back(std::meta::reflect_value(r));&#13;
}&#13;
return substitute(^__impl::replicator, args);&#13;
}&#13;
// end 'expand' definition&#13;
&#13;
template<typename E>&#13;
requires std::is_enum_v<E> // (1)&#13;
constexpr std::string enum_to_string(E value) {&#13;
std::string result = "<unnamed>";&#13;
[:expand(std::meta::enumerators_of(^E)):] >> // (2)&#13;
[&]<auto e>{&#13;
if (value == [:e:]) {&#13;
result = std::meta::identifier_of(e); // (3)&#13;
}&#13;
};&#13;
return result;&#13;
}&#13;
&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
enum Color { red, green, blue };&#13;
std::cout << "enum_to_string(Color::red): " << enum_to_string(Color::red) << 'n';&#13;
// std::cout << "enum_to_string(Color(42)): " << enum_to_string(42) << 'n'; &#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Bu örnekte deneysel özellikler (std::meta) normun. İşte programın çıktısı:








Kısaca fonksiyon modelinden bahsetmek istiyorum enum_to_string girmek. fonksiyon expand bu sadece bir geçici çözüm. İşlev çağrısı enum_to_string(Color(42)) işlev bir numaralandırma gerektirdiğinden bozulur: requires std::is_enum_v<E> (satır 1).

Satır (1) bir yansıma operatörü (^E) ve meta işlevini çağırın enum_to_std::meta::enumerators_of(^E) AÇIK. Son olarak, sözde birleştirici ([:refl:]) (2) satırında yansıma için dilbilgisi öğeleri. (3) satırındaki ikinci meta işlevi dizeyi oluşturur: std:meta::identifier_of(e)). Metafonksiyonlar, yansıma gibi derleme zamanında yürütülür.

Sözleşmeler

Bir sözleşme, yazılım bileşenleri için arayüzleri kesin ve doğrulanabilir bir şekilde belirtir. Bu yazılım bileşenleri ön koşulları, son koşulları ve değişmezleri karşılayan işlevlerdir.

İşte P2900 teklifinden basit bir örnek.


int f(const int x)&#13;
pre (x != 1) // a precondition assertion&#13;
post(r : r != 2) // a postcondition assertion; r refers to the return value of f&#13;
{&#13;
contract_assert (x != 3); // an assertion statement&#13;
return x;&#13;
}


fonksiyon f Bir ön koşulu, bir son koşulu ve bir değişmezi vardır. Ön koşul işlev çağrısından önce, son koşul işlev çağrısından sonra ve değişmez tam olarak çağrı sırasında kontrol edilir.

Fonksiyonu 1, 2 veya 3 numaralı argümanlarla çağırmak sözleşmeyi ihlal eder. Sözleşmenin ihlaline yanıt vermenin çeşitli yolları vardır.


void g()&#13;
{&#13;
f(0); // no contract violation&#13;
f(1); // violates precondition assertion of f&#13;
f(2); // violates postcondition assertion of f&#13;
f(3); // violates assertion statement within f&#13;
f(4); // no contract violation&#13;
}


C++26'nın temel dilinin yansıma ve sözleşmelerden çok daha fazlasını sunması mümkündür. Bunlardan kısaca bahsetmek ve ilgili tekliflerden bir kod pasajı sunmak istiyorum.

  • Joker karakterler ve genişletilmiş karakter kümeleri

auto [x, y, _] = f();


Alt çizgi (_) “Umurumda değil” anlamına gelir. ve birden çok kez kullanılabilir.

  • static_assertEklenti

static_assert(sizeof(S) == 1,&#13;
std::format("Unexpected sizeof: expected 1, got {}", sizeof(S))


C++26'daki şablonlarda birçok iyileştirme yapıldı. Benim favorim paket indeksleme:


template <typename... T>&#13;
constexpr auto first_plus_last(T... values) -> T...[0] {&#13;
return T...[0](values...[0] + values...[sizeof...(values)-1]);&#13;
}&#13;
&#13;
int main() {&#13;
//first_plus_last(); // ill formed&#13;
static_assert(first_plus_last(1, 2, 10) == 11);&#13;
}


delete("Should have a reason");


Bir sonraki adım nedir?


Bir sonraki yazımda C++26 kütüphanesine genel bir bakış sunacağım.


(Mayıs)
 
Üst