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_indexinguntuk deteksi kapabilitas alih-alih menebak dari nama compiler. - Apakah fallback rekursif atau
tupletetap mempertahankan kontrak API.
Pertanyaan klarifikasi
- Apakah Anda mengindeks value pack, type pack, atau template-parameter pack?
- Apakah indeksnya berupa konstanta waktu kompilasi atau bilangan bulat waktu proses (runtime integer)?
- Compiler, mode bahasa, dan versi CI mana saja yang didukung?
- Apakah indeks yang berada di luar jangkauan (out-of-range) harus gagal dalam suatu constraint, atau diperiksa oleh pemanggil?
- 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.
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_indexingdan 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.