Potongan Argumen Templat Separa dalam C 17
Class Template Argument Deduction (CTAD) telah diperkenalkan dalam C 17, membenarkan pengkompil membuat kesimpulan secara automatik argumen templat berdasarkan jenis argumen fungsi. Walau bagaimanapun, CTAD pada masa ini memerlukan semua hujah templat untuk disimpulkan atau dinyatakan secara eksplisit. Adakah mungkin untuk menentukan sebahagian argumen templat dan membiarkan yang selebihnya disimpulkan?
Pertimbangkan contoh berikut:
<code class="cpp">template<class T, class U, class V> struct Base { constexpr Base(T, U) {} constexpr Base(T, U, V) {} constexpr Base(V) {} }; void func() { constexpr Base val(1, 4.0, false); }</code>
Menggunakan CTAD, pengkompil akan menyimpulkan dengan betul bahawa val mempunyai jenis Base< ;int, double, bool>. Walau bagaimanapun, bagaimana jika kita ingin menentukan sebahagian argumen templat, seperti dalam contoh berikut?
<code class="cpp"> constexpr Base<T = bool> val1(1, 4.0); // U & V deduced -> Base<int, double, bool> constexpr Base<T = bool, T = int> val2(5.0); // V deduced -> Base<bool, int, double></code>
Malangnya, kod ini tidak akan disusun, kerana pengkompil memerlukan semua hujah templat sama ada disimpulkan atau dinyatakan secara eksplisit .
Penyelesaian
Memandangkan CTAD separa tidak disokong secara langsung, terdapat beberapa penyelesaian yang boleh kami gunakan:
<code class="cpp">using NewBase2 = Base<double, int>; void func() { constexpr NewBase2 val(1, 2); }</code>
Kesimpulan
CTAD separa tidak disokong secara langsung dalam C 17, tetapi terdapat penyelesaian yang tersedia untuk mencapai kefungsian yang serupa. Standard C 20 yang akan datang dijangka menyertakan sokongan untuk CTAD dengan templat alias, tetapi pada masa ini ia tidak termasuk sokongan untuk CTAD separa atau CTAD dengan pembina yang diwarisi.
Atas ialah kandungan terperinci ## Bolehkah C 17 Menyimpulkan Sebahagian Argumen Templat dalam Potongan Hujah Templat Kelas (CTAD)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!