[英]how to specialize the template
考虑现有情况
template<typename T, int N = 10>
struct A
{
//whatever
};
template <typename T1,typename T2, typename T3>
struct B;
template<typename T2, typename T3>
struct B<double,T2,T3>
{
//...
protected:
A<T2> myA;
};
现在我感兴趣的是能够通过不同于默认N
到A
在专业化B
不改变的声明B
。 可能吗?
我可以考虑一下
template<typename T2, typename T3, int N>
struct B<double,T2,T3>
{
//...
protected:
A<T2,N> myA;
};
但后来我不确定如何使用它......
好吧,你的B
级只能这样使用:
B<double, C, D> b;
C
和D
本身就是类型。
你不能在那里传递数字。 专业化不会帮助你。 专业化不会改变您可以使用类的方式或可以传递的参数,但您只能更改某个参数集的实现。 照这样说,
我建议将B
的声明改为:
template <typename, typename, typename, int = 10>
struct B;
Ans的专业化是这样的:
template<typename T2, typename T3, int N>
struct B<double,T2,T3, N> {
//...
protected:
A<T2, N> myA;
};
所以你的课程既像以前一样可用,就像这样:
B<double, C, D, 11> b;
如果你真的无法改变参数是什么,你可以进一步专门化它来接收一个带有数字作为模板参数的类型:
template<typename, int>
struct TypeAndNumber {};
并将你的社交化改变为:
template<typename T2, typename T3, int N>
struct B<TypeAndNumber<double, N>, T2, T3> {
//...
protected:
A<T2, N> myA;
};
现在你的课可以这样使用:
B<TypeAndNumber<double, 33>, C, B> b;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.