Rumah > pembangunan bahagian belakang > C++ > Mengapa Tiada Templat `is_complete` Standard dalam Boost?

Mengapa Tiada Templat `is_complete` Standard dalam Boost?

DDD
Lepaskan: 2024-10-29 01:47:30
asal
322 orang telah melayarinya

 Why is There No Standard `is_complete` Template in Boost?

Templat untuk Menyemak Kelengkapan Jenis

Pengenalan

Menentukan sama ada sesuatu jenis itu lengkap merupakan aspek pengaturcaraan yang penting. Walaupun perpustakaan Boost menawarkan pelbagai jenis TypeTraits, terdapat ketiadaan templat is_complete yang ketara. Artikel ini meneroka sebab templat sebegitu hilang dan mencadangkan penyelesaian yang menggunakan SFINAE.

Saiz Masalah

Cabaran segera dalam menentukan templat is_complete terletak pada fakta bahawa menggunakan saiz bagi yang tidak lengkap jenis adalah haram. Sekatan ini berpunca daripada kemungkinan kekaburan dan tingkah laku yang tidak ditentukan yang timbul daripada ketiadaan saiz objek yang sah.

Penyelesaian Khusus Platform

Untuk mengatasi had ini, Alexey Malistov mencadangkan platform- penyelesaian khusus yang memanfaatkan makro khusus pengkompil. Pendekatannya bergantung pada makro __COUNTER__, yang meningkat dengan setiap seruan makro. Ini membenarkan pembinaan templat dengan parameter dummy unik untuk setiap jenis yang diuji.

Kod untuk penyelesaian ini kelihatan seperti ini:

<code class="cpp">namespace
{
    template<class T, int discriminator>
    struct is_complete {
      static T & getT();
      static char (& pass(T))[2];
      static char pass(...);
      static const bool value = sizeof(pass(getT()))==2;
    };
}
#define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value</code>
Salin selepas log masuk

Dengan mentakrifkan is_complete sebagai templat kelas bersarang dan menggunakan makro __COUNTER__ sebagai diskriminasi, anda boleh menyemak kesempurnaan jenis mengikut cara khusus platform. Fungsi pas berfungsi sebagai hujah tiruan untuk menggunakan saiz dan membezakan antara jenis lengkap dan tidak lengkap.

SFINAE dan Kelengkapan Jenis

Manakala mekanisme SFINAE (Kegagalan Penggantian Bukan Ralat) biasanya digunakan untuk mendayakan atau melumpuhkan pengkhususan templat berdasarkan sifat jenis, ia tidak boleh digunakan secara langsung untuk menyemak kesempurnaan jenis. Sebab untuk ini ialah is_complete mesti menilai kepada pemalar, bukan jenis.

Kesimpulan

Ketiadaan templat is_complete standard dalam perpustakaan Boost adalah disebabkan oleh cabaran yang ditimbulkan dengan menggunakan sizeof kepada jenis yang tidak lengkap dan had SFINAE. Walau bagaimanapun, penyelesaian khusus platform, seperti yang dicadangkan oleh Alexey Malistov, boleh menyediakan cara praktikal untuk menyemak kesempurnaan jenis dalam persekitaran tertentu.

Atas ialah kandungan terperinci Mengapa Tiada Templat `is_complete` Standard dalam Boost?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan