Spesialisasi Template Parsial dan Penuh
Spesialisasikan template untuk tipe tertentu dan pola parameter parsial
Spesialisasi Template Parsial dan Penuh adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Saat Bentuk Generik Tidak Memadai
Terkadang suatu tipe tertentu memerlukan perilaku khusus. Spesialisasi templat memungkinkan Anda menyediakan implementasi yang disesuaikan untuk argumen tertentu.
Spesialisasi Penuh
Tentukan tipe yang tepat dan berikan alternatif yang lengkap.
template <typename T>
struct Printer {
void print(T x) { std::cout << x; }
};
template <>
struct Printer<bool> {
void print(bool x) { std::cout << (x ? "true" : "false"); }
};Menggunakan Spesialisasi
Kompiler memilih spesialisasi secara otomatis ketika tipe-tipe tersebut cocok.
Printer<int> pi; pi.print(42); // 42
Printer<bool> pb; pb.print(true); // trueSpesialisasi Templat Fungsi
Anda juga dapat melakukan spesialisasi pada templat fungsi — tetapi sebaiknya gunakan pembebanan berlebih. Pembebanan berlebih lebih mudah dikomposisikan dengan aturan pencarian normal.
template <typename T> void f(T x) { /* general */ }
template <> void f<int>(int x) { /* int specific */ }Mengapa Pembebanan Berlebih Lebih Baik daripada Spesialisasi Fungsi
Spesialisasi templat fungsi tidak berpartisipasi dalam resolusi pembebanan dengan cara yang sama. Pembebanan berlebih lebih jelas dan menghindari jebakan "Mengapa spesialisasi saya tidak dipanggil?".
Spesialisasi Parsial (Hanya Kelas)
Spesialisasi parsial memungkinkan Anda menyesuaikan implementasi untuk kategori tipe — misalnya, penunjuk, referensi, atau wadah apa pun.
template <typename T>
struct Type { static const char* name() { return "general"; } };
template <typename T>
struct Type<T*> { static const char* name() { return "pointer"; } };
template <typename T>
struct Type<std::vector<T>> { static const char* name() { return "vector"; } };Kasus Penggunaan Spesialisasi Parsial
Skenario umum:
- Perilaku berbeda untuk tipe penunjuk
- Versi yang dioptimalkan untuk tipe yang dapat disalin secara trivial
- Penggantian khusus untuk wadah
Spesialisasi Templat std
Anda dapat melakukan spesialisasi pada templat dalam ruang nama std (dengan batasan tertentu) — yang paling umum adalah std::hash untuk tipe pengguna agar dapat disimpan dalam std::unordered_map.
template <>
struct std::hash<MyType> {
size_t operator()(const MyType& v) const {
return /* compute hash */;
}
};Kapan Menggunakan Spesialisasi
Gunakan spesialisasi ketika:
- Suatu tipe memerlukan perilaku yang benar-benar berbeda
- Anda memerlukan jalur kode yang dioptimalkan untuk tipe-tipe yang telah diketahui
- Anda berintegrasi dengan pustaka generik yang menggunakan sifat tipe
Alternatif dalam C++ Modern
C++17 menambahkan if constexpr, dan C++20 menambahkan konsep — keduanya sering menggantikan spesialisasi dengan kode yang lebih bersih.
template <typename T>
void print(const T& x) {
if constexpr (std::is_same_v<T, bool>) {
std::cout << (x ? "true" : "false");
} else {
std::cout << x;
}
}Hierarki Spesialisasi
Jika beberapa spesialisasi dapat diterapkan, spesialisasi yang paling spesifik akan dipilih. Kompiler memilihnya secara tidak ambigu — atau menghasilkan kesalahan.
Jebakan Umum
Dua jebakan utama:
- Lupa menambahkan
template <>pada spesialisasi penuh - Menempatkan spesialisasi dalam berkas header tanpa inline — yang menyebabkan pelanggaran ODR
Pemeriksaan Singkat
Jenis spesialisasi apa yang tidak diizinkan secara langsung untuk templat fungsi?
Ringkasan
Spesialisasi templat menyediakan implementasi khusus tipe. Spesialisasi penuh menetapkan semua parameter; spesialisasi parsial (hanya untuk templat kelas) menyesuaikan implementasi untuk berbagai kategori. Alternatif modern seperti if constexpr dan konsep sering menghasilkan kode yang lebih bersih.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Spesialisasi Template Parsial dan Penuh” gratis?
Ya — teks lengkap “Spesialisasi Template Parsial dan Penuh” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Spesialisasi Template Parsial dan Penuh”?
Spesialisasikan template untuk tipe tertentu dan pola parameter parsial Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Spesialisasi Template Parsial dan Penuh” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Meninjau Kembali Template Fungsi dan Class
- Spesialisasi Template Parsial dan Penuh
- Template Variadik dan Paket Parameter
- Fungsi constexpr dan if constexpr