Я написал некоторый код для создания boost::mpl::vector
для использования в качестве таблицы поиска для факториальной функции, в качестве теста для более общей библиотечной функции, с помощью которой разработчик может создать таблицу поиска в виде статического массива примитивов. Функция (которая, скорее всего, будет реализована как определение макроса препроцессора) примет имя и размер инициализируемого массива, а также имя шаблона класса, который будет использоваться в качестве метафункции для инициализации каждого элемента i массива.
Я подумал, что лучший способ сделать это без использования внешних скриптов — это
- Создайте
boost::mpl::vector
, как это сделано в листинге кода ниже, и поместите возвращаемое значение введенной пользователем метафункции для каждого элемента массива в конец вектора; - Используйте элементы вектора для инициализации статического массива (возможно, с помощью ряда макросов, последний из которых будет использовать макрос
__VARARGS__
для достижения этой цели).
Я не знаю ни того, как бы я выполнил (2), ни того, является ли описываемая процедура хорошим способом сделать то, что я ищу. Вот следующие вопросы, на которые я хотел бы получить ответы:
Является ли моя процедура хорошим способом достижения того, что я ищу? Если нет, опишите лучшую процедуру, которая сделает то же самое без использования внешних скриптов.
Если моя процедура действительно является хорошим способом достижения того, что я ищу, как бы я реализовал (2)?
Я обязательно опубликую ссылку на исходный файл, содержащий библиотечную функцию, которую я опишу, как только реализую ее. Список кодов следует ниже.
пространство имен 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? */
static int foo[]
? - person Anycorn   schedule 25.02.2011