Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Ungkapan C 17 Lipatan Boleh Memudahkan Invokasi Fungsi Variadik?

Bagaimanakah Ungkapan C 17 Lipatan Boleh Memudahkan Invokasi Fungsi Variadik?

Barbara Streisand
Lepaskan: 2024-11-19 11:17:02
asal
983 orang telah melayarinya

How Can C  17 Fold Expressions Simplify Variadic Function Invocation?

Mempermudahkan Seruan Fungsi Variadik Menggunakan C 17 Lipatan

Argumen templat variadik menyediakan cara yang mudah untuk berfungsi dengan fungsi yang menerima bilangan argumen yang berubah-ubah . Walau bagaimanapun, mencipta rantai rekursif untuk memanggil fungsi pada setiap hujah variadic boleh membawa kepada penjanaan kod berlebihan. Begini cara anda boleh mengatasi isu ini menggunakan ungkapan C 17 lipatan atau penyelesaian pra-C 17.

Ungkapan C 17 Lipatan:

(f(args), ...);
Salin selepas log masuk

Ekspresi lipatan ini boleh digunakan untuk memanggil fungsi pada semua argumen templat variadic, menghasilkan satu fungsi N-arg hubungi.

Penyelesaian Pra-C 17:

1. Fungsi Balut dalam Pengecam:

Ubah fungsi untuk mengembalikan int, yang boleh digunakan sebagai hujah tiruan dalam senarai pemula:

int print_wrap(const T& t) {
  print(t);
  return 0;
}
Salin selepas log masuk

2. Cipta Pemula Senarai:

Gunakan pemula senarai untuk mengembangkan argumen variadic dan panggil fungsi yang diubah suai:

{ print_wrap(args)... }
Salin selepas log masuk

3. Tentukan Ruang Nama Pembantu:

Untuk menjadikan pendekatan ini boleh diguna semula, tentukan ruang nama pembantu:

namespace so {
  using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Salin selepas log masuk

4. Penggunaan:

SO_EXPAND_SIDE_EFFECTS(f(args));
Salin selepas log masuk

Kelebihan:

  • Menghasilkan hanya satu panggilan fungsi dengan N argumen.
  • Menyokong fungsi dengan operator koma terlebih beban.
  • Memastikan penilaian kiri-ke-kanan daripada hujah.

Atas ialah kandungan terperinci Bagaimanakah Ungkapan C 17 Lipatan Boleh Memudahkan Invokasi Fungsi Variadik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan