Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menggunakan Pembina Templat secara Eksplisit dalam Senarai C Initializer?

Bagaimana untuk Menggunakan Pembina Templat secara Eksplisit dalam Senarai C Initializer?

Linda Hamilton
Linda Hamiltonasal
2024-11-27 08:28:10635semak imbas

How to Explicitly Invoke Template Constructors in C   Initializer Lists?

Seruan Eksplisit Pembina Templat dalam Senarai Pemula

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;
};

Pernyataan Masalah

Kod yang disediakan cuba untuk secara eksplisit memanggil pembina templat T dalam senarai pemula U. Walau bagaimanapun, pendekatan ini gagal.

Jawapan

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.

Penjelasan

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. ]

Penyelesaian

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.

Rujukan

  • [std::type_identity](https://en.cppreference.com/w /cpp/types/type_identity)

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!

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