Rumah >pembangunan bahagian belakang >C++ >Mengapakah Potongan Hujah Templat Kelas Separa Tidak Mungkin?

Mengapakah Potongan Hujah Templat Kelas Separa Tidak Mungkin?

Barbara Streisand
Barbara Streisandasal
2024-11-09 01:02:01819semak imbas

Why is Partial Class Template Argument Deduction Not Possible?

Potongan Argumen Templat untuk Templat Kelas: Had dan Implikasi

Berikutan cadangan P0091 untuk menyatukan gelagat potongan hujah templat untuk fungsi dan templat kelas, timbul persoalan: mengapa potongan hujah templat kelas separa tidak mungkin?

Cadangan awal bertujuan untuk menyelaraskan mekanisme potongan, membenarkan potongan separa dalam kedua-dua konteks. Walau bagaimanapun, kebimbangan timbul mengenai kemungkinan kekeliruan apabila nilai yang disimpulkan menghasilkan berbilang pengkhususan templat yang sah. Contoh klasik ialah potongan jenis tupel: dengan menyatakan hanya satu argumen, pengkompil boleh membuat kesimpulan tuple dengan satu elemen, walaupun definisi tupel asal termasuk berbilang elemen.

Untuk mengelakkan kekaburan sedemikian, separa potongan hujah templat kelas telah dialih keluar daripada cadangan. Pengehadan ini mempengaruhi senario di mana pembangun mungkin ingin menyatakan secara eksplisit parameter templat tertentu sambil membiarkan yang lain disimpulkan.

Sebagai contoh, pertimbangkan templat kelas berikut:

template <std::size_t S, typename T>
struct test
{
    static constexpr auto size = S;
    using type_t = T;

    test(type_t (&amp;input)[size]) : data(input) {}
    type_t (&amp;data)[size]{};
};

Fungsi pembantu berfungsi sebagai gula sintaksis untuk membuat seketika objek ujian:

template <std::size_t S, typename T>
test<S, T> helper(T (&amp;input)[S]) { return input; }

Apabila menggunakan pembantu dengan tatasusunan pra-diisytiharkan:

int buffer[5];

auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer);      // Type deduced
auto c = helper(buffer);         // Type and size deduced

Potongan separa tidak disokong dalam kes templat kelas, seperti yang dibuktikan oleh kegagalan auto b = helper<5>(buffer);. Pengkompil tidak boleh membuat kesimpulan parameter T daripada hujah, yang membawa kepada ralat penyusunan. Sebaliknya, auto c = helper(buffer); berjaya menyimpulkan kedua-dua S dan T, menunjukkan keperluan untuk menentukan semua parameter templat secara eksplisit.

Atas ialah kandungan terperinci Mengapakah Potongan Hujah Templat Kelas Separa Tidak Mungkin?. 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