Logik Bersyarat
std::conditional dan if constexpr
Logik Bersyarat ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Memilih Jenis dan Cabang
Logik ciri jenis membolehkan kod memilih jenis dan laluan kod pada masa kompilasi. Alat utamanya ialah std::conditional dan if constexpr.
std::conditional
std::conditional_t<cond, A, B> menghasilkan A apabila cond benar, dan B selainnya.
#include <iostream>
#include <type_traits>
int main() {
using T = std::conditional_t<true, int, double>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}Memilih Jenis Storage
Kegunaan biasa: pilih jenis lebar untuk nilai besar dan jenis sempit untuk nilai yang lain.
#include <iostream>
#include <type_traits>
template <bool Big>
struct Storage {
using type = std::conditional_t<Big, long long, short>;
};
int main() {
Storage<true>::type a = 10;
std::cout << sizeof(a) << "\n";
return 0;
}Asas if constexpr
if constexpr (C++17) membuang cabang yang tidak dipilih pada masa kompilasi. Hanya cabang yang dipilih perlu dikompil untuk jenis yang diberikan.
#include <iostream>
#include <type_traits>
template <typename T>
void describe(T v) {
if constexpr (std::is_integral_v<T>)
std::cout << "integer: " << v << "\n";
else
std::cout << "other: " << v << "\n";
}
int main() {
describe(5);
describe(2.5);
return 0;
}Mengapa if constexpr Mengatasi if Masa Jalan
Dengan if biasa, kedua-dua cabang mesti dikompil untuk setiap T. Dengan if constexpr, cabang yang ditolak tidak dibuat instans, jadi cabang itu boleh mengandungi kod khusus jenis yang sebaliknya tidak sah.
Operasi Khusus Jenis
Perkara ini mustahil dilakukan dengan if biasa kerana .length() tidak akan dikompil untuk int.
#include <iostream>
#include <string>
#include <type_traits>
template <typename T>
auto size_of(const T& v) {
if constexpr (std::is_same_v<T, std::string>)
return v.length();
else
return sizeof(v);
}
int main() {
std::cout << size_of(std::string("hi")) << "\n";
std::cout << size_of(42) << "\n";
return 0;
}enable_if untuk Lebihan Beban
Sebelum if constexpr, std::enable_if memilih lebihan beban melalui SFINAE. Ia mengeluarkan fungsi daripada penyelesaian lebihan beban apabila syaratnya palsu.
#include <iostream>
#include <type_traits>
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }
int main() {
only_int(7);
return 0;
}Menggabungkan Syarat
Anda boleh menggabungkan trait dengan &&, || dan ! dalam syarat masa kompilasi, sama seperti nilai boolean biasa.
#include <iostream>
#include <type_traits>
template <typename T>
void check() {
if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
std::cout << "non-bool integer\n";
else
std::cout << "something else\n";
}
int main() {
check<int>();
check<bool>();
return 0;
}Pemilihan Rekursif Masa Kompilasi
if constexpr membolehkan rekursi masa kompilasi, yang berguna untuk memproses tuple atau pek parameter satu demi satu.
conjunction dan disjunction
C++17 turut menyediakan std::conjunction dan std::disjunction untuk melakukan AND/OR logik secara litar pintas terhadap senarai trait.
Memilih Alat yang Betul
Gunakan conditional untuk memilih jenis, if constexpr untuk memilih kod, dan enable_if/konsep untuk mengawal penyelesaian lebihan beban. Kod moden mengutamakan if constexpr dan konsep kerana lebih jelas.
Semakan Pantas
Ingat kembali manfaat utama if constexpr.
Rumusan
Anda telah mempelajari logik bersyarat masa kompilasi.
conditional_t<c,A,B>memilih jenisif constexprmemilih kod dan membuang cabang yang satu lagienable_ifmengawal penyelesaian lebihan beban melalui SFINAE- Gabungkan trait dengan operator logik
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Logik Bersyarat” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Logik Bersyarat”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Logik Bersyarat”?
std::conditional dan if constexpr Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Logik Bersyarat” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Membuat Pertanyaan Jenis
- Mengubah Jenis
- Logik Bersyarat
- Menulis Trait Tersuai