我可以生成一个大小为n的常量数组吗
Can I generate a constant array of size n
我想生成一个常数数组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
的顺序增加,这并不比手工放置预计算的数组好。
重要更新:您也应该看到这个问题。似乎不是预处理器而是模板引擎确实是图灵完备的(至少可以做递归)。所以,现在我怀疑答案是肯定的。
相关文章:
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 是否应避免从非常量迭代器转换为常量迭代器?
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 在编译时将常量字符* 转换为常量 char_type*
- C++ 确保子类为常量提供自定义值
- 字符串强制转换为常量字符*
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- 为什么当函数参数未定义为常量引用时存在无限递归?
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 为什么我的编译器将字符串感知为常量字符[]?
- 如何将TCHAR转换为常量字符
- LLVM 无法将数组类型强制转换为常量数组
- 将节点数组(可变长度)转换为常量浮点**以调用opencv.calcHist
- 将结构C++成员从非常量转换为常量
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
- 如何将常量字符*转换为常量无符号字符*