考虑现有情况
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;
};
但是我不确定如何使用它......
答案 0 :(得分:3)
嗯,你的班级B
只能这样使用:
B<double, C, D> b;
C
和D
类型本身。
你不能在那里传递号码。专业化不会帮助你。专业化不会改变您可以使用类的方式或可以传递的参数,但您只能更改某个参数集的实现。话虽如此,
我建议将B
的声明更改为:
template <typename, typename, typename, int = 10>
struct B;
回答专业化是这样的:
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;