0Pricing
C++ Academy · Pelajaran

Spesialisasi Penuh

Sesuaikan template untuk suatu tipe

Spesialisasi Penuh adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Ringkasan: Templat

Templat memungkinkan satu bagian kode bekerja untuk banyak tipe. Kompiler membuat versi konkret untuk setiap tipe yang Anda gunakan.

  • Bentuk umum menangani setiap tipe.
  • Terkadang suatu tipe memerlukan perlakuan khusus.
#include <iostream>

template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }

int main() {
    std::cout << maxOf(3, 9) << ' ' << maxOf(2.5, 1.5) << '\n';
    return 0;
}

Apa Itu Spesialisasi Penuh

Spesialisasi penuh menyediakan implementasi yang sepenuhnya terpisah untuk satu tipe tertentu, sehingga menggantikan templat umum hanya untuk tipe tersebut.

#include <iostream>

template <typename T>
void describe(T) { std::cout << "some type\n"; }

template <>
void describe(int) { std::cout << "an int\n"; }

int main() {
    describe(3.14);
    describe(42);
    return 0;
}

Sintaksnya

Spesialisasi penuh diawali dengan tanda kurung sudut kosong template <> dan mencantumkan tipe yang tepat dalam spesialisasi tersebut.

#include <iostream>

template <typename T>
struct TypeName { static const char* get() { return "unknown"; } };

template <>
struct TypeName<bool> { static const char* get() { return "bool"; } };

int main() {
    std::cout << TypeName<double>::get() << '\n';
    std::cout << TypeName<bool>::get() << '\n';
    return 0;
}

Melakukan Spesialisasi pada Templat Kelas

Templat kelas secara keseluruhan dapat dispesialisasi, sehingga suatu tipe memiliki anggota dan perilakunya sendiri yang berbeda dari templat utama.

#include <iostream>

template <typename T>
struct Storage {
    T value;
    void show() { std::cout << "value: " << value << '\n'; }
};

template <>
struct Storage<bool> {
    bool value;
    void show() { std::cout << (value ? "true" : "false") << '\n'; }
};

int main() {
    Storage<int> s{5}; s.show();
    Storage<bool> b{true}; b.show();
    return 0;
}

Mengapa Melakukan Spesialisasi

Spesialisasi menangani tipe yang memerlukan logika berbeda, seperti const char* yang memerlukan perbandingan teks, bukan perbandingan penunjuk.

#include <iostream>
#include <cstring>

template <typename T>
bool equal(T a, T b) { return a == b; }

template <>
bool equal(const char* a, const char* b) { return std::strcmp(a, b) == 0; }

int main() {
    std::cout << std::boolalpha;
    std::cout << equal(5, 5) << '\n';
    std::cout << equal("hi", "hi") << '\n';
    return 0;
}

Melakukan Spesialisasi pada Satu Anggota

Untuk templat kelas, Anda dapat melakukan spesialisasi hanya pada satu fungsi anggota untuk tipe tertentu, sambil menggunakan kembali bagian lainnya.

#include <iostream>

template <typename T>
struct Printer {
    void print(T v) { std::cout << v << '\n'; }
};

template <>
void Printer<char>::print(char v) {
    std::cout << "char: " << v << '\n';
}

int main() {
    Printer<int>{}.print(7);
    Printer<char>{}.print('A');
    return 0;
}

Kecocokan Lebih Diutamakan daripada Bentuk Umum

Jika terdapat spesialisasi penuh untuk tipe yang tepat, kompiler selalu memilihnya daripada templat utama.

#include <iostream>

template <typename T>
int rank() { return 0; }

template <>
int rank<double>() { return 99; }

int main() {
    std::cout << rank<int>() << ' ' << rank<double>() << '\n';
    return 0;
}

Spesialisasi Harus Mengikuti Templat Utama

Spesialisasi harus dideklarasikan setelah templat utama terlihat; jika tidak, kompiler tidak memiliki apa pun untuk dispesialisasi.

#include <iostream>

template <typename T>
const char* kind() { return "generic"; }

template <>
const char* kind<float>() { return "float"; }

int main() {
    std::cout << kind<int>() << ' ' << kind<float>() << '\n';
    return 0;
}

Melakukan Spesialisasi pada Templat std

Anda dapat melakukan spesialisasi pada beberapa templat pustaka standar, seperti std::hash, untuk tipe Anda sendiri agar tipe tersebut dapat digunakan dengan wadah berbasis pencincangan.

#include <iostream>

struct Point { int x, y; };

template <typename T>
struct Hasher { size_t operator()(const T&) { return 0; } };

template <>
struct Hasher<Point> {
    size_t operator()(const Point& p) { return p.x * 31 + p.y; }
};

int main() {
    Hasher<Point> h;
    std::cout << h(Point{2, 3}) << '\n';
    return 0;
}

Spesialisasi Nilai

Parameter templat yang bukan tipe dapat dispesialisasikan berdasarkan nilai tertentu, yang berguna untuk tabel saat kompilasi.

#include <iostream>

template <int N>
struct Fib { static const int value = Fib<N-1>::value + Fib<N-2>::value; };

template <>
struct Fib<0> { static const int value = 0; };

template <>
struct Fib<1> { static const int value = 1; };

int main() {
    std::cout << Fib<10>::value << '\n';
    return 0;
}

Pertahankan Perilaku yang Konsisten

Spesialisasi harus mempertahankan kontrak konseptual yang sama seperti templat utama; yang berubah hanya implementasinya. Jika tidak, pemanggil akan mendapatkan hasil yang mengejutkan.

#include <iostream>

template <typename T>
T zero() { return T{}; }

template <>
int zero<int>() { return 0; }

int main() {
    std::cout << zero<int>() << ' ' << zero<double>() << '\n';
    return 0;
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang sintaks spesialisasi penuh.

Rangkuman

Anda telah mempelajari spesialisasi penuh:

  • menyediakan implementasi khusus untuk satu tipe yang tepat
  • ditulis dengan template <> dan tipe konkret
  • kompilator selalu lebih memilih spesialisasi yang tepat
  • berfungsi untuk fungsi, kelas, anggota tunggal, dan nilai tertentu

Selanjutnya, Anda akan melihat spesialisasi parsial, yang mencocokkan pola tipe.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Spesialisasi Penuh” gratis?

Ya — teks lengkap “Spesialisasi 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 Penuh”?

Sesuaikan template untuk suatu tipe 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 1 dari 4.

Berapa lama pelajaran “Spesialisasi 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

  1. Spesialisasi Penuh
  2. Spesialisasi Parsial
  3. SFINAE
  4. Pola enable_if
← Kembali ke C++ Academy