我想生成一个常数数组 power [501] = {1,p%MODER,p * p%MODER,p * p * p%MODER,...,p ^ 500 %MODER},其中p是常数。
我知道我可以使用以下代码生成 p ^ n%MODER :
template<int a, int n> struct pow
{
static const int value = a * pow<a, n-1>::value % MODER;
};
template<int a> struct pow<a, 0>
{
static const int value = 1;
};
它确实有用!
我的问题是我是否可以生成我想要的数组?
答案 0 :(得分:4)
您可以将BOOST_PP_ENUM
用作:
#include <iostream>
#include <boost/preprocessor/repetition/enum.hpp>
#define MODER 10
template<int a, int n> struct pow
{
static const int value = a * pow<a, n-1>::value % MODER;
};
template<int a> struct pow<a, 0>
{
static const int value = 1;
};
#define ORDER(count, i, data) pow<data,i>::value
int main() {
const int p = 3;
int const a[] = { BOOST_PP_ENUM(10, ORDER, p) };
std::size_t const n = sizeof(a)/sizeof(int);
for(std::size_t i = 0 ; i != n ; ++i )
std::cout << a[i] << "\n";
return 0;
}
输出:
1
3
9
7
1
3
9
7
1
3
请参阅online demo
该行:
int const a[] = { BOOST_PP_ENUM(10, ORDER, p) };
扩展到:
int const a[] = { pow<p,0>::value, pow<p,1>::value, ...., pow<p,9>::value};
答案 1 :(得分:1)
除非n
有上限,否则我认为这是不可能的。检查this question。有一些方法可以使预处理器看起来像图灵完整的机器,但前提是你接受的事实是你的代码大小应该以{{1}}的顺序增加,这并不比手工放置预先计算的数组好。 / p>
重要更新:您也应该看到this question。似乎不是预处理器而是模板引擎确实是Turing-complete(至少可以进行递归)。所以,现在我怀疑答案是肯定的。