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
::typehanya ketika kondisinya benar, sehingga mengaktifkan SFINAE - ditempatkan pada tipe kembalian atau parameter templat bawaan
- gunakan alias
enable_if_tdan gabungkan sifat dengan operator logika - konsep menggantikannya dalam C++20, tetapi
enable_ifmasih 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
- Spesialisasi Penuh
- Spesialisasi Parsial
- SFINAE
- Pola enable_if