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
Lepaskan: 2024-12-05 06:09:10
asal
754 orang telah melayarinya

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... };
Salin selepas log masuk

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;
};
Salin selepas log masuk

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";
}
Salin selepas log masuk

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 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