Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menggunakan Pembina Templat secara Eksplisit dalam Senarai C Initializer?
Dalam C , bagaimanakah pembina templat eksplisit boleh digunakan apabila memulakan objek dalam pembina kelas? Pertimbangkan contoh berikut:
struct T { template<class> T(); }; struct U { U() : t<void>() {} // This approach does not work T t; };
Kod yang disediakan cuba untuk secara eksplisit memanggil pembina templat T dalam senarai pemula U. Walau bagaimanapun, pendekatan ini gagal.
Menyebut pembina templat secara eksplisit dalam senarai pemula bukanlah disokong dalam C. Had ini berpunca daripada fakta bahawa hujah templat biasanya ditentukan selepas nama templat fungsi menggunakan kurungan sudut. Memandangkan pembina tidak mempunyai nama mereka sendiri, tiada cara konvensional untuk menyampaikan hujah templat kepada mereka.
Piawaian C secara eksplisit menyatakan had ini dalam bahagian 14.8.1/7:
[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
Satu penyelesaian adalah dengan gunakan jenis pembantu untuk menghantar hujah templat sebagai hujah kepada pembina yang menerima identiti jenis. Contohnya:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Dalam kes ini, templat identiti yang ditakrifkan dalam Boost boleh digunakan untuk membungkus hujah templat. Sebagai alternatif, dalam C 20, jenis std::type_identity boleh digunakan.
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan Pembina Templat secara Eksplisit dalam Senarai C Initializer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!