我可以生成一个大小为n的常量数组吗

Can I generate a constant array of size n

本文关键字:小为 常量 数组 一个 我可以      更新时间:2023-10-16

我想生成一个常数数组power[501]={1,p%MODER,p*p%MODEL,p*p*p%Modern,…,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;
};

它确实有效!

我的问题是,我是否可以生成我想要的数组?

您可以将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

查看在线演示

线路:

int const a[] = { BOOST_PP_ENUM(10, ORDER, p) };

扩展到:

int const a[] = { pow<p,0>::value, pow<p,1>::value, ...., pow<p,9>::value};

除非n有上限,否则我认为这是不可能的。看看这个问题。有一些方法可以让预处理器看起来像图灵整机,但前提是你接受这样一个事实,即你的代码大小应该按照n的顺序增加,这并不比手工放置预计算的数组好。

重要更新:您也应该看到这个问题。似乎不是预处理器而是模板引擎确实是图灵完备的(至少可以做递归)。所以,现在我怀疑答案是肯定的。