voi*_*ter 5 c++ templates metaprogramming boost-mpl c-preprocessor
我编写了一些代码来生成一个boost::mpl::vector用作阶乘函数的查找表,作为一个更通用的库函数的测试,开发人员可以使用该函数以静态基元数组的形式生成查找表.该函数(最有可能实现为预处理器宏定义)将接受要初始化的数组的名称和大小,以及要用作初始化数组的每个元素i的元函数的类模板的名称.
我认为在不使用外部脚本的情况下执行此操作的最佳方法是
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?
*/
Run Code Online (Sandbox Code Playgroud)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)
| 归档时间: |
|
| 查看次数: |
1095 次 |
| 最近记录: |