C++ Academy · Pelajaran

Logik Bersyarat

std::conditional dan if constexpr

Pelajaran 3 daripada 413 langkah

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 jenis
  • if constexpr memilih kod dan membuang cabang yang satu lagi
  • enable_if mengawal penyelesaian lebihan beban melalui SFINAE
  • Gabungkan trait dengan operator logik
Percuma untuk bermula

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

  1. Membuat Pertanyaan Jenis
  2. Mengubah Jenis
  3. Logik Bersyarat
  4. Menulis Trait Tersuai
← Kembali ke C++ Academy