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

Mengapa tiada templat `is_complete` dalam Boost.TypeTraits?

Linda Hamilton
Lepaskan: 2024-10-31 04:07:53
asal
969 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan