Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?
Seruan Pembina Templat Eksplisit dalam C
Menyebut pembina templat secara eksplisit dalam senarai pemula boleh menjadi satu cabaran dalam C . Walaupun contoh yang diberikan:
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
Pendekatan gagal kerana ia cuba mentafsir sintaks secara salah. Menurut C Standard (14.8.1/7), "kerana senarai hujah templat eksplisit mengikut nama templat fungsi, dan kerana templat fungsi ahli penukaran dan templat fungsi ahli pembina dipanggil tanpa menggunakan nama fungsi, tidak ada cara untuk sediakan senarai hujah templat yang jelas untuk templat fungsi ini."
Ini bermakna tidak mungkin untuk menghantar hujah templat kepada pembina secara langsung. Walau bagaimanapun, penyelesaian wujud:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Dalam kes ini, jenis identiti secara berkesan menghantar hujah templat kepada pembina melalui perantara.
Sebagai alternatif, dalam C 20 dan kemudian, anda boleh gunakan std::type_identity type:
struct T { template<class U> T(std::type_identity<U>); }; struct U { U() : t(std::type_identity<void>()) {} T t; };
Dengan menggunakan penyelesaian ini, anda boleh memulakan pembina templat dengan berkesan secara eksplisit dalam senarai pemula, walaupun had yang dikenakan oleh Piawaian C.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!