Topik wawancara representatif

Wawancara coding: Bagaimana cara kerja pack indexing di C++26, dan kapan Anda harus menyediakan fallback?

CodingSedang
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Sebuah pustaka variadik harus membaca tipe atau nilai ke-N namun tetap dapat dikompilasi pada compiler tanpa dukungan C++26. Jelaskan sintaks pack-indexing, batasan (constraints), mode kegagalan, deteksi fitur, dan perancangan fallback.

Petunjuk dan ruang lingkup

Sebuah pustaka generik harus membaca elemen pada posisi tetap dari type pack atau function argument pack menggunakan pack indexing C++26, sementara toolchain yang lebih lama tetap dapat melakukan build. Jelaskan pengindeksan expression-pack, pengindeksan type-pack, batasan indeks, deteksi fitur, dan implementasi kompatibilitas.

Hal ini menguji aturan bahasa dan fallback rekayasa; jangan mengklaim bahwa setiap versi compiler telah mengimplementasikan fitur tersebut.

Apa yang diuji oleh pewawancara

  • Apakah Anda membedakan pengindeksan expression-pack dari penentu pack-indexing untuk type pack.
  • Apakah Anda mengetahui bahwa indeks harus berupa konstanta waktu kompilasi (compile-time constant) dan tidak boleh melebihi ukuran pack.
  • Apakah Anda menggunakan __cpp_pack_indexing untuk deteksi kapabilitas alih-alih menebak dari nama compiler.
  • Apakah fallback rekursif atau tuple tetap mempertahankan kontrak API.

Pertanyaan klarifikasi

  1. Apakah Anda mengindeks value pack, type pack, atau template-parameter pack?
  2. Apakah indeksnya berupa konstanta waktu kompilasi atau bilangan bulat waktu proses (runtime integer)?
  3. Compiler, mode bahasa, dan versi CI mana saja yang didukung?
  4. Apakah indeks yang berada di luar jangkauan (out-of-range) harus gagal dalam suatu constraint, atau diperiksa oleh pemanggil?
  5. Apakah fallback harus mempertahankan diagnostik dan kompleksitas selain perilakunya?

Jawaban 30 detik

"Pack indexing C++26 memilih elemen expression-pack dengan indeks konstanta; type pack menggunakan penentu pack-indexing. Indeks harus berupa konstanta waktu kompilasi dan tidak boleh berada di luar rentang. Bilangan bulat waktu proses masih memerlukan array, tuple, atau tabel dispatch. Saya akan mendeteksi __cpp_pack_indexing, menggunakan sintaks langsung jika tersedia, menggunakan rekursi atau operasi tuple pada compiler yang lebih lama, dan menguji batas serta perilaku API yang identik."

Desain langkah demi langkah

1. Pisahkan kedua bentuk

Pengindeksan expression-pack memilih nilai dari argumen fungsi; pengindeksan type-pack memilih tipe dari parameter template. Keduanya memindahkan pemilihan posisional ke dalam instansiasi template dan mengurangi rekursi yang ditulis manual, namun sintaks dan penggunaan selanjutnya berbeda.

2. Wajibkan evaluasi waktu kompilasi

Indeks adalah ekspresi konstanta dalam konteks parameter template non-tipe. Bilangan bulat waktu proses tidak dapat menggantikannya. Jika pemilihan waktu proses diperlukan, materialisasikan pack sebagai tuple, array, atau tabel fungsi dan lakukan dispatch pada waktu proses.

cpp
template <std::size_t I, class... Ts>
using type_at = Ts...[I];

template <std::size_t I, class... Ts>
constexpr decltype(auto) value_at(Ts&&... values) {
  return values...[I];
}

3. Tangani pack yang kosong dan di luar batas rentang

Pack yang kosong tidak memiliki elemen yang dapat diindeks, dan indeks yang sama dengan atau lebih besar dari ukuran pack adalah tidak valid. Template publik harus menolaknya sejak awal dengan constraint requires yang menjaga indeks tetap di bawah ukuran pack. Pengujian harus mencakup panggilan kosong, elemen pertama, terakhir, dan panggilan di luar rentang.

4. Gunakan deteksi fitur

cppreference mencatat makro uji fitur __cpp_pack_indexing dengan nilai 202311L. Periksa makro bersama dengan mode bahasa, dan gunakan CI compiler jika diperlukan; string versi compiler saja bukanlah kontrak kapabilitas bahasa.

5. Rancang fallback untuk toolchain lama

Tanpa C++26, type pack dapat menggunakan template rekursif atau utilitas pemilihan tipe tuple; value pack dapat terlebih dahulu membentuk tuple dan memanggil utilitas akses posisional. Pertahankan constraint batas yang sama dan kompilasi kedua jalur di CI.

6. Evaluasi API dan diagnostik

Pack indexing langsung mempersingkat implementasi, namun harus tetap berada di balik API yang stabil. Dokumentasikan mode standar yang diperlukan, pastikan diagnostik menyebutkan indeks dan ukuran pack, serta lakukan tolok ukur (benchmark) waktu kompilasi dan kode yang dihasilkan untuk kedua jalur alih-alih hanya membandingkan baris kode sumber.

Model jawaban berkualitas tinggi

"Pertama, saya akan mengidentifikasi entitas yang diindeks. Pengindeksan expression-pack C++26 memilih suatu nilai, sedangkan type pack menggunakan penentu pack-indexing; indeksnya adalah konstanta waktu kompilasi, sehingga pack yang kosong dan di luar batas harus gagal pada batas constraint. Deteksi __cpp_pack_indexing; gunakan sintaks langsung pada toolchain yang mampu dan gunakan rekursi, tuple_element, serta get pada toolchain lama di balik API yang sama. Indeks runtime memerlukan tuple atau tabel dispatch. Pengujian mencakup kasus kosong, batas tepi, di luar rentang, kedua mode bahasa, dan kedua implementasi."

Kesalahan umum

  • Menggunakan runtime integer sebagai indeks template → bahasa memerlukan konstanta → gunakan tuple, array, atau tabel dispatch.
  • Hanya memeriksa __cplusplus dukungan fitur bergantung pada status implementasi → periksa __cpp_pack_indexing dan CI.
  • Membiarkan batas bersifat implisit → error muncul jauh di dalam instansiasi → batasi antarmuka sejak awal.
  • Hanya mengimplementasikan type pack → panggilan value-pack masih memerlukan rekursi → uji kedua bentuk secara terpisah.
  • Mengubah semantik pada fallback → toolchain berperilaku berbeda → bagikan constraint, pengujian, dan API yang stabil.

Pertanyaan lanjutan dan jawabannya

Bisakah pack indexing menyelesaikan pengindeksan runtime?

Tidak. Ini memerlukan konstanta waktu kompilasi. Pemilihan runtime memerlukan tuple, array, tabel fungsi, atau struktur dispatch runtime lainnya.

Mengapa menambahkan constraint requires?

Bahasa pada akhirnya akan menolak indeks yang berada di luar batas rentang, tetapi constraint eksplisit memberikan diagnostik antarmuka yang lebih awal dan lebih jelas serta memungkinkan fallback mengekspos kontrak yang sama.

Apakah fallback rekursif selalu lebih lambat?

Tidak. Kode waktu proses dapat dioptimalkan ke hasil yang sama, sedangkan kedalaman template, waktu kompilasi, dan diagnostik dapat berbeda. Validasi dengan matriks dukungan dan tolok ukur (benchmark) daripada menilai berdasarkan panjang sintaks.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Tangkapan Layar untuk perintah coding

Ambil tangkapan layar soal, lalu telusuri batasan, solusi, kode, edge case, dan kompleksitas secara berurutan.

Lihat alat