C++类对非类型模板参数的部分专用化

C++ Class partial specialization on non-type template parameter

本文关键字:专用 参数 类型 C++      更新时间:2023-10-16

我不确定我的术语是否正确,但我认为我有一个既有类型模板参数又有非类型模板参数的类模板,我想仅对非类型参数进行部分专门化:

template<class T, int I> struct A
{
void f();
};
template<class T> void A<T, 1>::f() {}
int main()
{
A<int, 1> a1;
a1.f();
}

使用Visual C++,得到了CCD_ 1和CCD_。

然而,如果我删除了类型参数,那么我似乎可以专门处理非类型参数:

template<int I> struct B
{
void g();
};
void B<1>::g() {}
int main()
{
B<1> b1;
b1.g();
}

那么,我想要的是不可能的,还是我只是做得不对?如果不可能,还有其他选择吗?

让我们考虑一下标准(工作草案)是怎么说的:

类模板的成员[…]可以显式专用于类模板的给定隐式实例化,即使该成员[……]是在类模板定义中定义的。成员[…]的显式专用化是使用显式专用的语法指定的。

换句话说,你试图做的事情是不允许的
仅此而已。


想象一下,如果是这样的话,你也会被允许这样做:

template<class T, int>
struct A { void f(); };
template<typename T>
void A<T, 1>::f() {}
template<>
struct A<int, 1> {};

也就是说,为类模板定义f,该类模板的专门化甚至不能有f的声明
这没有多大意义,是吗?

另一方面,考虑以下成员专业化:

template<>
void A<int, 1>::f() {}

它导致无法进一步专门化的A<int, 1>的实例化
换句话说,在这种情况下你不能这样做:

template<>
struct A<int, 1> {};

因此,f的存在在某种程度上得到了的保证