Rumah >pembangunan bahagian belakang >C++ >Bolehkah C Metaprogramming Digunakan untuk Mencipta Tatasusunan Statik Masa Kompilasi Secara Dinamik?
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.
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.
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.
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... };
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!