Saya memiliki struktur kode berikut:

for
 for
  for
   for
    {
    things
    if(condition1||condition2)
    }

Dan pada dasarnya bahwa "Jika" memeriksa 2 variabel yang tergantung dari setiap loop sebelumnya, tetapi hanya harus diperiksa apakah pengguna mengatakannya pada awal program, jika tidak, "jika" tidak ada gunanya.

Saya bisa menggunakan if(boolean&&(condition1||condition2)) yang akan bekerja dengan baik kecuali untuk fakta bahwa itu akan diperiksa untuk setiap iterasi tunggal dari semua loop.

Jadi pertanyaan saya adalah: apakah ada cara untuk mendapatkan C ++ untuk menonaktifkan "jika" sepenuhnya (tanpa memeriksa kondisi setiap loop) jika pengguna mengatakannya, tanpa mengulangi dengan dan tanpa jika ??? Seperti, misalnya:

if(boolean)
 {
  all the fors
    things
    if(conditio1||condition2)
 }
else
 {
  all the fors
    things
 }

Ini berfungsi dengan baik tetapi jika saya harus melakukan perubahan di masa depan, saya harus menulisnya 2 kali dengan kemungkinan lupa tentang kedua kalinya atau membuat kesalahan. Dan saya juga memiliki 3 bagian kode lainnya dengan masalah yang sama, sehingga kode akan sangat panjang.

EDIT: Beberapa dari Anda berpikir kita berbicara tentang jumlah iterasi yang tidak signifikan, tetapi bahwa "jika" harus diperiksa setidaknya 10,8 juta kali pada akhir setiap program lengkap. Dan seperti yang saya katakan, saya punya (sekarang 2) lebih banyak bagian kode dengan masalah yang sama, jadi cukup waktu bisa disimpan. Sayang sekali solusi if constexpr digunakan c ++ 17

0
byrey3 5 April 2021, 00:02

2 jawaban

Jawaban Terbaik

Anda dapat menulis kode Anda dalam fungsi seperti ini

template<bool Boolean>
void code(/* parameters */)
{
  for // ...
    for // ...
      // all the fors ...
      {
         // things 
         if constexpr (Boolean)  // compile time branch
         {
            if(condition1 || condition2)
               // ...
         }
      }
}

if constexpr hanya akan dikompilasi ketika Boolean adalah benar. Jadi di situs panggilan yang dapat Anda lakukan

bool boolean = /* some run-time initialization */
if (boolean)
  code<true>(/* arguments */);
else 
  code<false>(/* arguments */);

Perhatikan bahwa ini bukan sesuatu yang harus Anda lakukan demi kinerja, kecuali Anda telah mengukur dan memprofilkan kode untuk melihat apakah itu adalah hambatan. Setelah Anda selesai melakukannya, Anda dapat menggunakan teknik di atas.


Jika Anda belum menggunakan C ++ 17, blok seluruh if constexpr dapat diganti oleh

work<Boolean>(/* arguments */);

Di mana work adalah templat fungsi yang khusus hanya berfungsi di true case:

template<bool>
void work(/* parameters */) {}  

template<>
void work<true>(/* parameters */) 
{
  if(condition1 || condition2)
     // ...
}
2
cigien 4 April 2021, 23:32

Gerakkan untuk-loop Anda ke dalam fungsi dan gunakan panggilan balik sebagai argumen fungsi.

#include <iostream>

void func(void (*callback)(int i, int j)) {
  for (int i = 0; i < 100; i++) {
    for (int j = 0; j < 100; j++) {
      std::cout << "i = " << i << ", j = " << j << ", (i + j) % 3 == " << (i + j) % 3 << "\n";
      callback(i, j);
    }
  }
}

int main() {
  bool verbose = false;
  std::cin >> verbose;
  if (verbose) {
    func([](int i, int j){ if((i + j) % 3 == 0) std::cout << "Their sum is divided by three.\n" ; });
  }
  else {
    func([](int i, int j){});
  }
}
0
S.M. 4 April 2021, 21:21