Rumah >pembangunan bahagian belakang >C++ >Mengapa tiada templat `is_complete` dalam Boost.TypeTraits?

Mengapa tiada templat `is_complete` dalam Boost.TypeTraits?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 04:07:53984semak imbas

 Why is there no `is_complete` template in Boost.TypeTraits?

Templat Is_Complete dalam Pustaka Boost

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 &amp; getT();   
      static char (&amp; 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!

Kenyataan:
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