【发布时间】:2011-05-12 13:23:29
【问题描述】:
我有这个代码
template<int N, bool C = true>
struct A;
template<int N>
struct A<N, !(N % 5)> {
/* ... */
};
// should work
A<25> a;
也就是说,对于可以被5 整除的数字N,编译器应该使用部分特化。但是编译器不会接受这种部分特化,因为标准要求它拒绝这样的代码,其中部分特化的非类型参数引用参数而不是简单的参数(例如,A<N, N> 将是有效的)。但是这样做的原因是什么?
请注意,我可以简单地将我的代码更改为更冗长的示例并且它是有效的
template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/* ... */
};
// should work
A<25> a;
这很好,因为它不再是非类型参数。但是规范禁止更直接的部分专业化的原因是什么?
【问题讨论】:
-
即使这样也是不允许的:ideone.com/Vxx0R ...我想知道标准中的哪个部分不允许这样做。 §14.5.4/9 也适用于此?
-
这几乎是一样的,当你可以将它们包装在一个结构中时,为什么没有部分函数规范?
-
你为什么还要在这段代码中使用模板?
标签: c++ partial-specialization design-rationale