如何专门化模板

时间:2017-08-20 04:27:27

标签: c++ templates c++14

考虑现有情况

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;
};

但是我不确定如何使用它......

1 个答案:

答案 0 :(得分:3)

嗯,你的班级B只能这样使用:

B<double, C, D> b;

CD类型本身。

你不能在那里传递号码。专业化不会帮助你。专业化不会改变您可以使用类的方式或可以传递的参数,但您只能更改某个参数集的实现。话虽如此,

我建议将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;