C++ - 模板类专用化是否有办法包含常规模板中的代码

C++ - Is there a way for a template class specialization to contain code from the general template?

本文关键字:包含常 代码 是否 专用 C++      更新时间:2023-10-16

给定一个C++类:

template<typename T>
class A {
public:
    int a;
    T x;
    int getA() {return a;}
};

模板专用化是否可以从 A "继承"(没有实际C++继承(成员,如 a 和 getA((?此外,在编写为类执行大量模板专用化的代码时,我应该多次键入相同的代码(这有点违背模板的全部目的(,还是重组类以使其适应专用化(例如,通过将另一个模板类成员封装在里面,以便专用化仅限于该类(?

模板专用化是否可以从 A "继承"(没有实际C++继承(成员,如 a 和 getA((?

简短的回答:不。

长答案:不,A是一个类模板,因此它不是可以从中继承成员(数据或函数(的东西。
此外,您的要求听起来像 - 我怎么能破坏专业化的全部目的?好吧,对不依赖于模板参数的成员使用基类的继承。这是更直接的方法,也是语言为您提供的功能。

不能只从类型继承成员函数而不扩展该类型。
有很多技巧可以达到目的:直接继承,mixin,从上面继承的成语等等。
它们都通过继承来组合接口。我不明白为什么要妖魔化它。

如果你不想要额外的类,那么你可以像:

template <class T>
class A {
public:
        void f() { cout << "here" << endl; }
};
template <> class A<char> : private A<A<char> >  {
public:
        using A<A<char> >::f;
};

当然,人们希望能够编写template <> class A<char> : private A<char>并获得从通用案例继承的专业化,但这是不可能的,所以我使用了一个技巧来实例化某种类型的通用案例(这里类似于 CRTP,但可以使用任何其他类型(。

另一个技巧是使用第二种类型和默认值。

我找到了一种方法:

#include <type_traits>
typedef void**const*const** dummy;
// Generic template
template <typename T1, typename T2 = dummy>
class A {
    static_assert(std::is_same<T1,dummy>::value || std::is_same<T2,dummy>::value,
                  "too many template arguments for class template 'A'");
    typedef typename std::conditional<std::is_same<T1,dummy>::value, T2, T1>::type T;
    public:
        int a;
        T x;
        int getA() {return a;}
};
// Specialization for int
template <typename X>
class A<int,X> : public A<X,int> {
    public:
        void foo() {}
};

类模板 A 仅使用一个模板参数进行实例化。当 A 使用 int 以外的任何类型实例化时,它具有泛型的所有成员,正如预期的那样。当 A 使用 int 实例化时,它不仅具有专用化的成员,还具有泛型的成员。