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.
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.
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>
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.
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.
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!