tradicionalmente, las matrices estáticas en C se pueden definir en el tiempo de compilación usando fijo- Matrices de tamaño. Sin embargo, para ciertos escenarios, puede ser deseable asignar valores programáticamente en el momento de la compilación. Este artículo explora las técnicas de metaprogramación para lograr dicha creación dinámica de matrices estáticas.
usando las características C 0x, es posible inicializar las matrices locales o miembros de las plantillas de A de A Lista de argumentos de plantilla variádica. Esta solución tiene limitaciones debido a la profundidad de instanciación de plantilla máxima.
para asignar valores selectivamente en el tiempo de compilación, se puede emplear una combinación de plantillas variádicas y metafunciones. La plantilla de MetaFunc sirve como un paquete de parámetros que genera una secuencia de valores basada en su índice. Una plantilla Generate_Array puede crear una matriz del tamaño deseado usando los valores generados.
templatestruct MetaFunc { enum { value = index 1 }; }; template class F> struct generate_array { typedef typename generate_array_impl ::result result; }; template class F, unsigned... args> struct generate_array_impl { typedef typename generate_array_impl ::value, args...>::result result; }; template class F, unsigned... args> struct generate_array_impl::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::result A; for (size_t i = 0; i Este ejemplo define una matriz estática del tamaño 5, con valores {1, 2, 3, 4, 5} asignado en el tiempo de compilación usando la metafunction de MetaFunc.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3