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