使用基本模板标识符时继承

Inherit while using base template identifiers

本文关键字:标识符 继承      更新时间:2023-10-16

我有两个模板 A 和 B,它们都具有相同的模板类型。A 始终从 B 继承,但它始终为 B 选择与 A 本身相同的模板。

这本身很好,但这需要我编写两次模板类型。是否可以以某种方式对 A 中的类型进行类型定义,并在从子类继承时引用泛型 typedef 名称?

下面是一些无法编译的示例代码,但应该清楚地了解我想做什么:

// #1
template <typename T>
struct A
{
    typename T type;
    // class details here
};
// #2
template <typename T>
struct B
{
    // class details here
};
// #3
template <>
struct A<int>
    : B<type> // Compiler complains here (type not defined)
    //: B<A::type> // Compiler complains here (type not defined)
    // I could write ": B<int>" instead, but this is repitition I want to avoid
{
    // class specialization details here
};

我愿意接受替代解决方案。这对我来说很重要的原因是我有大量的代码列表,例如 #3 的代码,我想减少重复(以避免错误(。

同一模板的两个不同专用化是完全不相关的类型*,因此您不能在专用化A<int>中使用基本模板中的A<>::type。即使您在A<int>专用化中定义了type,在定义类之前,它也不会可用,这发生在继承列表之后

你可以而且应该在那里使用: B<int>。它不比B<type>更多的重复,并明确指出A<int>继承自B<int>,如果您通过间接,则不会立即看到。

你的设计让我烦恼的另一件事是A<>(通用的(与B<>没有任何关系,但A<int>继承自B<int>。虽然该语言允许在专业化中完全不相关的行为,但这可能会让其他程序员感到惊讶,因为他们可以将A<T>的对象传递给某些T B<T>函数,但对其他则不然......

您想要解决的实际问题是什么?


* 这意味着专用化不提供特殊行为(即仅提供与基本不同的位(,而是提供该类型的所有行为。如果您只想覆盖部分行为,则应考虑其他替代方法,例如将A<T>(泛型(重构为基础,以便A<int>(或其他专用化(可以借用实现。或者,如果行为变化很小,您可能只能专门化一些成员函数......