Rumah >pembangunan bahagian belakang >C++ >Bolehkah Tatasusunan Statik dalam C Dimulakan Secara Program pada Masa Penyusun?
Penciptaan Tatasusunan Statik Berprogram pada Masa Kompilasi dalam C
Mencipta tatasusunan statik pada masa penyusunan dalam C ialah teknik yang berharga untuk mengoptimumkan prestasi dan memastikan integriti data. Satu cara untuk mentakrif tatasusunan statik adalah melalui sintaks berikut:
const std::size_t size = 5; unsigned int list[size] = { 1, 2, 3, 4, 5 };
Walaupun pendekatan ini mudah, ia memerlukan penetapan nilai tatasusunan secara eksplisit. Untuk mendapatkan lebih fleksibiliti, mungkin wajar untuk menetapkan nilai ini "secara pemprograman" pada masa penyusunan menggunakan pelbagai teknik pengaturcaraan meta.
Soalan 1: Penetapan Nilai Programmatik
Bolehkah kita gunakan teknik pengaturcaraan meta untuk menetapkan nilai tatasusunan "secara pemprograman" pada masa penyusunan?
Jawapan:
Ya, menggunakan ciri C 0x, kita boleh memulakan tatasusunan tempatan atau ahli templat daripada senarai hujah templat variadic. Walaupun pendekatan ini mungkin dihadkan oleh kedalaman instantiasi templat, ia boleh memberikan peningkatan yang ketara dalam fleksibiliti.
Soalan 2: Penetapan Nilai Terpilih
Dengan mengandaikan bahawa semua nilai dalam tatasusunan adalah sama kecuali beberapa, bolehkah kita menetapkan nilai secara selektif pada masa penyusunan dengan cara pengaturcaraan?
Jawapan:
Ya, kita boleh menggunakan gabungan templat variadic dan templat fungsi untuk menjana tatasusunan dengan nilai tertentu. Sebagai contoh, pertimbangkan kod berikut:
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... }; 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; };
Kod ini membolehkan kami membuat tatasusunan dengan nilai tertentu dengan menentukan fungsi templat yang menentukan nilai pada setiap indeks.
Contoh :
Untuk mencipta tatasusunan saiz 5 dengan nilai 1 hingga 5:
template<size_t index> struct MetaFunc { enum { value = index + 1 }; }; 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"; }
Atas ialah kandungan terperinci Bolehkah Tatasusunan Statik dalam C Dimulakan Secara Program pada Masa Penyusun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!