【问题标题】:Inherit while using base template identifiers在使用基本模板标识符时继承
【发布时间】:2013-08-13 19:42:50
【问题描述】:

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

这本身很好,但这需要我编写两次模板类型。从子类继承时是否可以以某种方式对 A 中的类型进行 typedef 并引用泛型 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 不是类型 A,因此未定义 A::typeA。你应该做的是 A : B 如果你想要你想要的功能,但这更有可能是一个 XY 问题?
  • 或者 'template struct A: B::typeA>...' 但是这个接缝没用

标签: c++ templates inheritance


【解决方案1】:

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

你可以并且你应该在那里使用: B&lt;int&gt;。它与B&lt;type&gt; 没有更多的重复,并明确表明A&lt;int&gt; 继承自B&lt;int&gt;,如果您通过间接方式,这些内容不会立即可见。

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

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


* 这意味着 specialization 不提供 special 行为(即仅与基础不同的位),但是所有该类型的行为。如果您只想覆盖部分行为,您应该考虑其他替代方案,例如将A&lt;T&gt;(通用)重构为基础,以便A&lt;int&gt;(或其他专业化)可以借用实现。或者,如果行为变化很小,您也许可以专门化一些成员函数...

【讨论】:

  • 我想我的小例子有点抽象而且有点错误。 A 总是派生自某个 B1、B2、...、BN,因此不能将行为直接提升到 A。实际情况是将常量(枚举)映射到处理该常量的类型。示例:Mapping&lt;INT /*some integer value like 1*/&gt;::function_typevoid(*)(int) 相同。继承一些 B 将添加不变量。所有的 A 都会从某个 B 继承,但 B 不是固定的。一个例子是基于常量值配置一些偏移机制。
  • @ThomasEding:如果需要,只需从 B&lt;int&gt; 继承即可。你明白为什么那里没有::type,对吧?
  • 是的,将其标记为答案。我知道我的代码不起作用,并且想知道一些类似的东西是否可以起作用。但听起来除了以普通方式进行之外,没有(好的)解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2021-05-07
  • 2015-04-18
  • 2017-07-08
相关资源
最近更新 更多