Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memastikan Tiada Klausa `else` Pernah Dilaksanakan dalam Rantaian C `constexpr if-else`?

Bagaimanakah Saya Boleh Memastikan Tiada Klausa `else` Pernah Dilaksanakan dalam Rantaian C `constexpr if-else`?

Linda Hamilton
Linda Hamiltonasal
2024-11-27 11:10:09727semak imbas

How Can I Ensure No `else` Clause is Ever Executed in a C   `constexpr if-else` Chain?

Mencegah Ketaksempurnaan Klausa Constexpr If-Else

Dalam C , seseorang mungkin menghadapi keperluan untuk menegaskan bahawa semua constexpr jika keadaan dalam pernyataan if-else dipenuhi. Tanpa penegasan sedemikian, klausa else boleh diambil secara tidak dijangka.

Pertimbangkan kod berikut:

if constexpr(condition1){
    ...
} else if constexpr (condition2) {
   ....
} else if constexpr (condition3) {
  ....
} else {
    // I want the else clause never taken. But I heard the code below is not allowed
    static_assert(false);
}

Seseorang mungkin menganggap bahawa klausa else tidak akan diambil kerana semua syarat harus saling eksklusif. Walau bagaimanapun, mengikut piawaian C, penegasan sedemikian tidak dibenarkan.

Penyelesaian: Ketergantungan Templat

Untuk mengelakkan klausa lain daripada diambil, seseorang mesti membuat pernyataan yang dibuang bergantung pada parameter templat. Ini boleh dicapai menggunakan kod berikut:

template <class... T> constexpr std::false_type always_false{};

if constexpr(condition1){
    ...
} else if constexpr (condition2) {
   ....
} else if constexpr (condition3) {
  ....
} else {       
    static_assert(always_false<T>);
}

Penaakulan

Piawaian C menyatakan bahawa program tidak terbentuk jika tiada pengkhususan yang sah dapat dijana untuk templat atau substatement dalam templat. Dengan membuat pernyataan yang dibuang bergantung pada parameter templat, pengkompil boleh memastikan bahawa tiada pengkhususan yang sah boleh dijana apabila tiada syarat dipenuhi, dengan berkesan menghalang klausa lain daripada diambil.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Tiada Klausa `else` Pernah Dilaksanakan dalam Rantaian C `constexpr if-else`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn