Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggunakan Fungsi pada Semua Argumen Templat Variadic dalam C?

Bagaimana untuk Menggunakan Fungsi pada Semua Argumen Templat Variadic dalam C?

Susan Sarandon
Susan Sarandonasal
2024-11-11 03:51:02298semak imbas

How to Invoke a Function on All Variadic Template Arguments in C  ?

Templat Variadik C: Menjalankan Fungsi pada Semua Argumen Templat

Dalam C , selalunya wajar untuk mengulangi argumen templat variadic dan melaksanakan operasi tertentu, seperti memanggil sesuatu fungsi. Ini boleh dicapai menggunakan sama ada:

C 17 Fold Expression

(f(args), ...);

Walau bagaimanapun, jika fungsi yang dipanggil berpotensi mengembalikan objek dengan pengendali koma yang terlebih beban, anda harus menggunakan:

((void)f(args), ...);

Penyelesaian Pra-C 17

Pendekatan biasa ialah memanfaatkan permulaan senarai dan melakukan pengembangan di dalamnya:

{ print(Args)... }

Memandangkan cetakan() mengembalikan tidak sah, anda boleh atasi masalah dengan mengembalikan int:

{ (print(Args), 0)... }

Untuk memastikan ini berfungsi dengan sebarang bilangan argumen, anda boleh menjadikan pek sentiasa mempunyai sekurang-kurangnya satu elemen:

{ 0, (print(Args), 0)... }

Anda boleh merangkum corak ini menjadi makro yang boleh diguna semula:

namespace so {
    using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

Untuk mengendalikan operator koma yang terlebih beban, anda boleh mengubah suai makro:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \
        ::so::expand_type{ 0, ((PATTERN), void(), 0)... }

Jika anda bimbang tentang peruntukan memori yang tidak perlu, anda boleh menentukan jenis tersuai yang menyokong permulaan senarai tetapi tidak menyimpan data:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&amp;&amp;...) {}
    };
}

Atas ialah kandungan terperinci Bagaimana untuk Menggunakan Fungsi pada Semua Argumen Templat Variadic dalam C?. 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