Rumah >pembangunan bahagian belakang >C++ >Bolehkah Teknik Metaprogramming C 0x Digunakan untuk Menetapkan Nilai Secara Pengaturcaraan kepada Tatasusunan Statik pada Masa Penyusunan?
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!