C++ 如何专门化模板

C++ 如何专门化模板,c++,templates,c++14,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>

考虑现有情况

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

但是我不知道如何使用它…

好吧,你的类
B
只能这样使用:

B<double, C, D> b;
template<typename T2, typename T3, int N>
struct B<double,T2,T3, N> {
    //...

protected:
    A<T2, N> myA;
};
B<TypeAndNumber<double, 33>, C, B> b;
专业化应该是这样的:

B<double, C, D> b;
template<typename T2, typename T3, int N>
struct B<double,T2,T3, N> {
    //...

protected:
    A<T2, N> myA;
};
B<TypeAndNumber<double, 33>, C, B> b;
模板
结构B{
//...
受保护的:
myA;
};
因此,您的类既可以像以前一样使用,也可以像这样使用:

B<double, C, D, 11> b;
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{
//...
受保护的:
myA;
};
现在您的类可以像这样使用:

B<double, C, D> b;
template<typename T2, typename T3, int N>
struct B<double,T2,T3, N> {
    //...

protected:
    A<T2, N> myA;
};
B<TypeAndNumber<double, 33>, C, B> b;
B;

第二部分是我一直在寻找的,实际上我开始朝这个方向思考,而你打败了我:)