Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Bolehkah C 17 Menyimpulkan Sebahagian Argumen Templat dalam Potongan Hujah Templat Kelas (CTAD)?

## Bolehkah C 17 Menyimpulkan Sebahagian Argumen Templat dalam Potongan Hujah Templat Kelas (CTAD)?

Susan Sarandon
Susan Sarandonasal
2024-10-25 07:23:02200semak imbas

## Can C  17 Partially Deduce Template Arguments in Class Template Argument Deduction (CTAD)?

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:

  • Buat templat alias untuk kombinasi argumen khusus, seperti yang ditunjukkan dalam contoh berikut:
<code class="cpp">using NewBase2 = Base<double, int>;

void func() {
  constexpr NewBase2 val(1, 2);
}</code>
  • Gunakan teknik pengaturcaraan meta templat untuk memilih templat yang sesuai secara bersyarat berdasarkan argumen yang ditentukan separa.

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!

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