繁体   English   中英

如何专门化模板

[英]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;
};

现在我感兴趣的是能够通过不同于默认NA在专业化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;

CD本身就是类型。

你不能在那里传递数字。 专业化不会帮助你。 专业化不会改变您可以使用类的方式或可以传递的参数,但您只能更改某个参数集的实现。 照这样说,

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM