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
Patricia Arquetteasal
2024-12-04 14:05:11775semak imbas

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... };

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";
}

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!

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