0Pricing
C++ Academy · Pelajaran

Pola enable_if

Batasi template dengan cara klasik

Pola enable_if adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Apa Itu enable_if?

std::enable_if adalah sifat kecil yang secara bersyarat mendefinisikan anggota type. Ketika kondisinya benar, tipe tersebut ada; ketika salah, templat di sekitarnya dihapus melalui SFINAE.

  • Berada di dalam <type_traits>.
  • Merupakan alat klasik untuk membatasi templat.
#include <iostream>
#include <type_traits>

template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
doubleIt(T v) { return v * 2; }

int main() {
    std::cout << doubleIt(21) << '\n';
    return 0;
}

Cara Kerjanya

enable_if<Cond, T>::type adalah T hanya ketika Cond benar. Jika salah, tidak ada anggota type, sehingga substitusi gagal.

#include <iostream>
#include <type_traits>

int main() {
    std::cout << std::boolalpha;
    std::cout << std::is_same<std::enable_if<true, int>::type, int>::value << '\n';
    return 0;
}

enable_if pada Tipe Kembalian

Penempatan yang paling umum adalah pada tipe kembalian. Fungsi hanya ada ketika kondisinya terpenuhi.

#include <iostream>
#include <type_traits>

template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
half(T v) { return v / 2; }

int main() {
    std::cout << half(5.0) << '\n';
    return 0;
}

enable_if sebagai Parameter Templat

Idiom lainnya menempatkan enable_if dalam parameter templat bawaan, sehingga tipe kembalian tetap bersih.

#include <iostream>
#include <type_traits>

template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
T triple(T v) { return v * 3; }

int main() {
    std::cout << triple(4) << '\n';
    return 0;
}

Pintasan enable_if_t

C++14 menambahkan alias std::enable_if_t<Cond, T> sehingga Anda dapat menghilangkan kerumitan typename ...::type.

#include <iostream>
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_integral<T>::value, T>
negate(T v) { return -v; }

int main() {
    std::cout << negate(8) << '\n';
    return 0;
}

Memasangkan Dua Pembebanan Berlebih

Sediakan kondisi yang saling melengkapi agar tepat satu pembebanan berlebih valid untuk tipe apa pun, tanpa ambiguitas.

#include <iostream>
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_integral<T>::value, const char*>
category() { return "integer"; }

template <typename T>
std::enable_if_t<!std::is_integral<T>::value, const char*>
category() { return "non-integer"; }

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

Menggabungkan Kondisi

Gunakan operator logika pada nilai sifat untuk menyatakan batasan yang lebih kaya, seperti "bilangan bulat dan bertanda".

#include <iostream>
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_integral<T>::value && std::is_signed<T>::value, T>
magnitude(T v) { return v < 0 ? -v : v; }

int main() {
    std::cout << magnitude(-12) << '\n';
    return 0;
}

Membatasi Konstruktor

Anda dapat menempatkan enable_if pada parameter templat konstruktor agar konstruktor tersebut hanya tersedia untuk tipe yang kompatibel.

#include <iostream>
#include <type_traits>

struct Wrapper {
    int value;
    template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
    Wrapper(T v) : value(static_cast<int>(v)) {}
};

int main() {
    Wrapper w(42);
    std::cout << w.value << '\n';
    return 0;
}

Jebakan Argumen Templat Bawaan

Dua pembebanan berlebih yang hanya berbeda pada parameter templat enable_if bawaan akan dianggap sebagai definisi ulang. Berikan bentuk yang berbeda, misalnya menempatkan salah satu kondisi pada tipe kembalian.

#include <iostream>
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_integral<T>::value, void>
printKind() { std::cout << "int\n"; }

template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, void>
printKind() { std::cout << "float\n"; }

int main() {
    printKind<int>();
    printKind<double>();
    return 0;
}

Perbandingan dengan Konsep

Konsep C++20 menggantikan sebagian besar penggunaan enable_if dengan sintaks yang jauh lebih jelas, tetapi enable_if tetap penting untuk kode sebelum C++20 dan beberapa kasus khusus.

#include <iostream>
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_arithmetic<T>::value, T>
square(T v) { return v * v; }

int main() {
    std::cout << square(6) << ' ' << square(1.5) << '\n';
    return 0;
}

Contoh Lengkap

Gabungkan semuanya: keluarga fungsi yang memformat bilangan bulat dan bilangan pecahan secara berbeda, lalu dipilih saat kompilasi.

#include <iostream>
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_integral<T>::value, void>
format(T v) { std::cout << "int[" << v << "]\n"; }

template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, void>
format(T v) { std::cout << "float(" << v << ")\n"; }

int main() {
    format(10);
    format(3.5);
    return 0;
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang enable_if.

Rangkuman

Anda telah mempelajari pola klasik enable_if:

  • mendefinisikan ::type hanya ketika kondisinya benar, sehingga mengaktifkan SFINAE
  • ditempatkan pada tipe kembalian atau parameter templat bawaan
  • gunakan alias enable_if_t dan gabungkan sifat dengan operator logika
  • konsep menggantikannya dalam C++20, tetapi enable_if masih banyak digunakan

Dengan ini, kursus Spesialisasi Templat dan SFINAE selesai.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola enable_if” gratis?

Ya — teks lengkap “Pola enable_if” 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 “Pola enable_if”?

Batasi template dengan cara klasik 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 4 dari 4.

Berapa lama pelajaran “Pola enable_if” 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