Joh*_*itb 36 c++ partial-specialization design-rationale
我有这个代码
template<int N, bool C = true>
struct A;
template<int N>
struct A<N, !(N % 5)> {
/* ... */
};
// should work
A<25> a;
Run Code Online (Sandbox Code Playgroud)
也就是说,对于N可被整除的数字,5编译器应使用部分特化.但编译器不会接受部分特化,因为标准要求它拒绝这样的代码,其中部分特化的非类型参数引用参数而不仅仅是一个参数(比如,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;
Run Code Online (Sandbox Code Playgroud)
这很好,因为它不再是非类型参数.但是,规范禁止更直接的部分专业化的原因是什么?
Jer*_*fin 14
我认为很多都是历史性的.最初不允许使用非类型模板参数.当它们被添加时,存在很多限制.当人们尝试不同的可能性,并确认它们没有引起问题时,一些限制被删除了.
除了没有人愿意为改变它们而烦恼之外,其中一些原始限制仍然没有特别的原因.很像那里,其中许多可以解决,所以通常删除它们通常不会造成任何特别的困难.大多数情况下,它归结为一个问题,是否有人关心这个特定的案例,写一篇关于它的论文.
| 归档时间: |
|
| 查看次数: |
3802 次 |
| 最近记录: |