我需要知道对于所有编译器是否可以保证&N == &N_neg[MAXN]
以下代码中的这一点。
int N_neg[MAXN], N[MAXN]; // defined in the global scope!
T<N> t; // so I can access N[i] (for i < 0) inside T
如果是这样,我就完成了,这就是我所需要的。如果没有,请阅读下面的完整问题。
注意:这仅适用于编程竞赛,因此不必担心可维护性。我更关心保持T
易于理解。
我有以下定义:
template<int* B> class T { ... }
但是,在里面T
,我访问B[-n]
, where n > 0
。所以,这就是我想要做的:
#define MAXN 1000
int N[2*MAXN];
T<N + MAXN> t;
根据编译器,这是不允许的。cppreference甚至有一个关于这种特殊情况的例子,说它不起作用,我已经在其他地方搜索了解决方案(还没有找到)。我确实了解模板是如何工作的,并且我知道(以及为什么)每个模板参数的值必须在编译期间知道,并且N
只有在链接期间才知道的地址。
有什么建议么?
这是完整的代码(以防有人根据问题提出任何建议):
template<int M, int B[]> struct Hash {
int h; Hash(int h = 0): h(h) {}
int disp(int i) { return B[i]; }
Hash concat(int ch, int i) { return (h + (ll) ch * B[i]) % M; }
Hash subtract(int hl, int i) { return (ll) (h - hl + M) * B[-i] % M; }
static void genBase(int n, int b) {
B[0] = 1, B[-1] = powlg(b, M-2, M); // b^(-1) % M = b^(M-2) % M
for (int i = 1; i < n; i++)
B[i] = (ll) B[i-1] * b % M, B[-i] = (ll)B[-i+1] * B[-1] % M;
}
};