Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?

Bagaimanakah Saya Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-03 04:56:12537semak imbas

How Can I Explicitly Invoke a Template Constructor in a C   Initializer List?

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!

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