C++: C++20 kavramlarını kullanarak değişken desenleri kısıtlayın

Bugün C++20 kavramlarının bir yönüne ışık tutmak istiyorum: Variadic tip model parametresinin veri tipini, setteki tüm veri tipleri için belirli bir tiple sınırlamaya yardımcı olurlar.

Duyurudan sonra devamını okuyun

Andreas Fertig, dünya çapında yüz yüze ve uzaktan kurslar sunan uzman bir C++ eğitmeni ve danışmanıdır. C++ standartları komitesinde yer almakta ve uluslararası konferanslarda düzenli olarak konuşmalar yapmaktadır. C++ Insights (https://cppinsights.io) ile C++ programcılarının C++'ı daha iyi anlamalarına yardımcı olan, uluslararası kabul görmüş bir araç geliştirdi.

İngilizce blogumda C++20 kavramlarıyla ilgili bazı makaleler yayınladım:

Diyelim ki bir fonksiyon modeli var Sumfonksiyonun değerlerine eklediği ve sonucu döndürdüğü herhangi bir sayıda parametre alabilen. C++17 katlama ifadesini kullanan bir uygulama şuna benzer:


template<typename T, typename... Ts>
auto Sum(const T& val, const Ts&... vals)
{
  return (val + ... + vals);
}

Uygulama işe yarıyor ancak kullanım için kapıyı açık bırakıyor Sum karışık veri türleriyle:


Sum(2, 3, 4, 5);    // #A
Sum(2, 3, 4, 5.6);  // #B

#A ile mutluyum; ama #B'nin derlenmesini istemiyorum. Eğer C++17'ye sadık kalırsam, yapabilirim Sum birini kullanarak static_assert ve aşağıdaki gibi özellikleri sınırlayın:

Duyurudan sonra devamını okuyun


template<typename T, typename... Ts>
auto Sum(const T& val, const Ts&... vals)
{
  static_assert((std::is_same_v<T, Ts> and ...));

  return (val + ... + vals);
}

Bu uygulamayla ilgili bir sorun açıktır: kullanıcılar Sum uygulama detaylarına bakmadıkları sürece sınırlamayı bilmiyorlar. Bunu yapmaya zorlanmamalılar. Belgeleme yardımcı olabilir, ancak amaç kodun kendisinde mümkün olduğu kadar çok belge bırakmaktır.

Farklı bir durum çözülecekse başka bir sorun ortaya çıkabilir. Aşırı yüklemelere izin vermek isterseniz ne olur? İle static_assert bu yol tamamen kapatılmıştır. Burada sunulan vaka için iyi olabilir. Ancak burada da: karışık kayan nokta türleri için aşırı yüklemeye izin vermek isterseniz ne olur?

Kavramları uygulamaya koyduğunuzda olası bir çözüm şöyle görünebilir:


template<typename T, std::same_as<T>... Ts>
auto Sum(const T& val, const Ts&... vals)
{
  return (val + ... + vals);
}

Buradaki konsepti kullanıyorum std::same_asveri türlerini görüntülemek için Ts aynı türe T Sınır. THE std::same_as burada tek bir parametreyle çalışıyor çünkü kavramların soldan sağa boşlukları doldurma yeteneği var ve derleyicinin burada yaptığı da tam olarak bu.

Ayrıca, aşağıdaki gibi tek bir spesifik veri türü için değişken bir fonksiyon modeline sahip olduğunuzu da söyleyebilirsiniz. int sahip olmak isterdim.

THE Sum-Uygulama aşağıdaki şekilde değişir:


auto Sum(const std::same_as<int> auto&... vals) { return (vals + ...); }

Kavramlar, genel amaçlı programlama araç kutunuz için harika ve güçlü bir araçtır.


(Ben)


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir