将MPL向量转换为静态数组

voi*_*ter 5 c++ templates metaprogramming boost-mpl c-preprocessor

我编写了一些代码来生成一个boost::mpl::vector用作阶乘函数的查找表,作为一个更通用的库函数的测试,开发人员可以使用该函数以静态基元数组的形式生成查找表.该函数(最有可能实现为预处理器宏定义)将接受要初始化的数组的名称和大小,以及要用作初始化数组的每个元素i的元函数的类模板的名称.

我认为在不使用外部脚本的情况下执行此操作的最佳方法是

  1. 创建一个boost::mpl::vector,如下面的代码清单所示,并将数组中每个元素的用户提供的元函数的返回值推送到向量的后面;
  2. 使用向量的元素初始化静态数组(可能通过使用一系列宏,其中最后一个将使用__VARARGS__宏来完成此操作).

我既不知道我将如何完成(2),也不知道我描述的程序是否是我寻求的好方法.以下是我想要回答的以下问题:

  1. 我的手术是完成我所寻求目标的好方法吗?如果没有,请描述一个更好的程序,它可以完成同样的事情,而无需使用外部脚本.
  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?
    */
    
    Run Code Online (Sandbox Code Playgroud)

Any*_*orn 9

http://www.boost.org/doc/libs/1_46_0/libs/preprocessor/doc/index.html

#define MACRO(z, i, data) \
    mpl::at_c<data,i>::value

static const data[] = { BOOST_PP_ENUM(N, MACRO, factorialTable) };
Run Code Online (Sandbox Code Playgroud)