Rumah >pembangunan bahagian belakang >C++ >Bolehkah Teknik Metaprogramming C 0x Digunakan untuk Menetapkan Nilai Secara Pengaturcaraan kepada Tatasusunan Statik pada Masa Penyusunan?

Bolehkah Teknik Metaprogramming C 0x Digunakan untuk Menetapkan Nilai Secara Pengaturcaraan kepada Tatasusunan Statik pada Masa Penyusunan?

Linda Hamilton
Linda Hamiltonasal
2024-12-05 06:09:10692semak imbas

Can C  0x Metaprogramming Techniques be Used to Programmatically Assign Values to Static Arrays at Compile Time?

Menjana Tatasusunan Statik Secara Programmatik pada Masa Kompilasi dalam C

Memandangkan keupayaan untuk mentakrif tatasusunan statik pada masa penyusunan dalam C, adakah mungkin untuk menetapkan nilai mereka secara pemrograman menggunakan teknik pengaturcaraan meta?

Soalan 1: Penetapan Programmatik Nilai Tatasusunan

Ya, menggunakan ciri C 0x, ia boleh dilakukan untuk memulakan elemen tatasusunan "secara pemprograman" pada masa penyusunan. Pertimbangkan contoh berikut:

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

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

Soalan 2: Penetapan Selektif Nilai Tatasusunan

Dengan mengandaikan tatasusunan mengandungi nilai berulang dengan beberapa pengecualian, adalah mungkin untuk menetapkan secara selektif nilai secara pemrograman:

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

Penggunaan untuk tatasusunan dengan sifar berulang kecuali elemen 2 dan 3:

template<size_t index>
struct MetaFunc {
    enum { value = index == 2 || index == 3 ? index + 1 : 0 };
};

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

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

Walaupun penyelesaian ini dihadkan oleh kedalaman instantiasi templat maksimum, ia menunjukkan potensi C 0x untuk penciptaan tatasusunan terprogram dan pengamulaan.

Atas ialah kandungan terperinci Bolehkah Teknik Metaprogramming C 0x Digunakan untuk Menetapkan Nilai Secara Pengaturcaraan kepada Tatasusunan Statik pada Masa Penyusunan?. 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