Escribí un código para generar un boost::mpl::vector
para usar como una tabla de búsqueda para una función factorial, como una prueba para una función de biblioteca más general con la que un desarrollador puede generar una búsqueda tabla en forma de una matriz estática de primitivas. La función (que muy probablemente se implementaría como una definición de macro de preprocesador) aceptaría el nombre y el tamaño de la matriz que se inicializará, así como el nombre de una plantilla de clase que se utilizará como la metafunción para inicializar cada elemento i de la matrizConvirtiendo un vector MPL en una matriz estática
pensé que la mejor manera de ir haciendo esto sin el uso de scripts externos sería
- Crear un
boost::mpl::vector
, como se hace en el listado de código de abajo, y empuje el valor de retorno de la metafunción proporcionada por el usuario para cada elemento de la matriz en la parte posterior del vector; - Utilice los elementos del vector para inicializar la matriz estática (quizás usando una serie de macros, la última de las cuales usaría la macro
__VARARGS__
para lograr esto).
No sé cómo lograría (2) ni si el procedimiento que describo es una buena manera de hacer lo que busco. Aquí están las siguientes preguntas para las cuales me gustaría recibir respuestas:
- ¿Mi procedimiento es una buena manera de lograr lo que busco? De lo contrario, describa un procedimiento mejor que logre lo mismo, sin el uso de scripts externos.
Si mi procedimiento es de hecho una buena manera de lograr lo que busco, ¿cómo implementaría (2)?
Me aseguraré de publicar un enlace al archivo de origen que contiene la función de biblioteca que describo una vez que lo implemente. El listado del código sigue a continuación.
namespace mpl = boost :: mpl;
template <typename x> struct factorial: mpl::if_<mpl::greater<x, mpl::int_<1>>, mpl::multiplies<x, factorial<x::prior>>, mpl::int_<1> >::type {}; template <typename sequence, typename size> struct compileTable: mpl::if_<mpl::greater<size, mpl::int_<0>>, compileTable< mpl::push_front<sequence, factorial<size>>::type, size::prior >, sequence >::type {}; static const int TABLE_SIZE = 13; typedef compileTable< mpl::vector<>, mpl::int_<TABLE_SIZE> >::type factorialTable; /* ** This is where I am stuck; how would I use the elements ** of factorialTable to initialize a static array? */
use http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/for-each.html – Anycorn
Estoy un poco confundido aquí, ya que para cada uno es un algoritmo de tiempo de ejecución, ¿cómo lo usaría para inicializar una matriz estática? –
¿qué quiere decir exactamente con matriz estática? 'static int foo []'? – Anycorn