C++类对非类型模板参数的部分专用化
C++ Class partial specialization on non-type template parameter
我不确定我的术语是否正确,但我认为我有一个既有类型模板参数又有非类型模板参数的类模板,我想仅对非类型参数进行部分专门化:
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
的存在在某种程度上得到了的保证。
相关文章:
- 具有常量引用参数的函数模板专用化
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 具有可变参数非类型参数的模板专用化
- 类专用化,没有用作专用化模板参数的类的模板参数
- 基于枚举参数调用专用模板方法
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 专用于可变参数模板成员函数
- 如何将模板类专用化为也接受模板模板参数
- 调用模板专用化,具有更多参数的单参数模板调用的特定值
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 具有不同非类型模板参数的模板类部分专用化
- 带有void类型和参数的C++11模板专用化
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 使用模板模板参数进行模板定义的函数专用化
- 在模板专用化中使用非类型模板模板参数
- C++具有可变参数专用参数的模板,用于参数数量
- 具有专用参数的类方法