Semasa mencari templat is_complete dalam pustaka Boost, ternyata bahawa templat sedemikian tidak wujud dalam Boost.TypeTraits. Ini menimbulkan persoalan tentang rasional di sebalik ketiadaannya dan kemungkinan reka bentuk templat sedemikian.
Pertimbangkan coretan kod berikut:
<code class="cpp">//! Check whether type complete template<typename T> struct is_complete { static const bool value = ( sizeof(T) > 0 ); }; ... // use it in such a way BOOST_STATIC_ASSERT( boost::is_complete<T>::value );</code>
Kod ini cacat kerana menggunakan saiz bagi jenis yang tidak lengkap adalah haram. Oleh itu, penyelesaian alternatif dicari.
Satu pendekatan yang mungkin melibatkan penggunaan SFINAE. Walau bagaimanapun, ini menimbulkan had kerana ia tidak boleh menyelesaikan masalah secara amnya tanpa melanggar Peraturan Satu Definisi (ODR).
Penyelesaian khusus platform yang dicadangkan oleh Alexey Malistov tersedia untuk MSVC dengan sedikit pengubahsuaian:
<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>
Malangnya, penggunaan makro __COUNTER__ tidak diseragamkan, berpotensi mengehadkan kebolehgunaannya merentas penyusun yang berbeza.
Atas ialah kandungan terperinci Mengapa tiada templat `is_complete` dalam Boost.TypeTraits?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!