Rumah > pembangunan bahagian belakang > C++ > Bolehkah C Metaprogramming Digunakan untuk Mencipta Tatasusunan Statik Masa Kompilasi Secara Dinamik?

Bolehkah C Metaprogramming Digunakan untuk Mencipta Tatasusunan Statik Masa Kompilasi Secara Dinamik?

Patricia Arquette
Lepaskan: 2024-12-04 14:05:11
asal
774 orang telah melayarinya

Can C   Metaprogramming Be Used for Dynamically Creating Compile-Time Static Arrays?

Mencipta Tatasusunan Statik Secara Program pada Masa Kompilasi dalam C

Pengenalan Masalah

Secara tradisinya, tatasusunan statik dalam C boleh ditakrifkan pada masa penyusunan menggunakan tetap- susunan saiz. Walau bagaimanapun, untuk senario tertentu, mungkin wajar untuk menetapkan nilai secara pemrograman pada masa penyusunan. Artikel ini meneroka teknik pengaturcaraan meta untuk mencapai penciptaan tatasusunan statik yang dinamik.

Soalan 1: Menetapkan Nilai Secara Pengaturcaraan

Menggunakan ciri C 0x, adalah mungkin untuk memulakan tatasusunan tempatan atau ahli templat daripada senarai hujah templat variadic. Penyelesaian ini mempunyai pengehadan disebabkan kedalaman instantiasi templat maksimum.

Soalan 2: Penetapan Nilai Terpilih

Untuk menetapkan nilai secara selektif pada masa penyusunan, gabungan templat variadik dan metafungsi boleh digunakan. Templat MetaFunc berfungsi sebagai pek parameter yang menjana jujukan nilai berdasarkan indeksnya. Templat generate_array kemudiannya boleh mencipta tatasusunan saiz yang dikehendaki menggunakan nilai yang dijana.

Contoh Pelaksanaan

template<size_t index> struct MetaFunc { enum { value = index + 1 }; };

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};

template<size_t N, template<size_t> class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, unsigned... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
Salin selepas log masuk

Contoh Penggunaan

void test() {
    const size_t count = 5;
    typedef generate_array<count, MetaFunc>::result A;

    for (size_t i = 0; i < count; ++i) 
        std::cout << A::data[i] << "\n";
}
Salin selepas log masuk

Contoh ini mentakrifkan statik tatasusunan saiz 5, dengan nilai {1, 2, 3, 4, 5} ditetapkan pada masa penyusunan menggunakan Metafungsi MetaFunc.

Atas ialah kandungan terperinci Bolehkah C Metaprogramming Digunakan untuk Mencipta Tatasusunan Statik Masa Kompilasi Secara Dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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