简化问题

我有以下内容:

class Foo {};
class Bar : public Foo {};

template <class T>
class TemplatedClass   : public T {};
class SpecializedClass : public TemplatedClass<Foo> {};

我需要一堂新课,
class RespecializedClass : public TemplatedClass<Bar> {};

但是这个新类在各个方面都与SpecializedClass相同,但它专门研究了Bar,该类是从Foo派生的。只需复制粘贴SpecializedClass即可,但是随后我必须维护两个相同的代码行。

有没有一种方法可以从RespecializedClass导出SpecializedClass,但可以进一步将模板数据类型专门化为子数据类型?

原始问题(更接近我的实际问题)

我得到了下面的类层次结构:
class X {};

class A {};

template <class T>
class B : public T, public A {};

class C : public B<X> {};

class D : public C {};

我无法触及XABCD背后的任何来源。我只能衍生并扩展它们。

现在,我从X派生了一个新类-称为小写x。 (我通常不会在一种设置中使用Xx,但是在这种情况下,视觉相似性在这种情况下很有用。)
class x : public X {};

我需要的是一个与D相同的类,但是在x而不是X上进行模板化。

当然,我可以简单地复制粘贴CD并将它们专门化为x,如下所示:
class c : public B<x> {};
class d : public c {};

但是,每当修改CD时,我都必须维护此代码行。

有没有办法做类似的事情
class d : public D, public B<x> {};

“特化”模板的数据类型在层次结构中进一步?

注意

无需阅读本段;实际上,这可能比启发更令人困惑。我需要将d模板化为x而不是X的原因是xX封装了数据库表,并且已编写B来更新其模板化的任何表。贴近事实,我正在使用的基础结构为所有数据库表自动生成封装类。在数据库字典中,可以配置“派生”表,这些表从另一表继承所有字段和键,然后用其他字段和键扩展该表。基础结构不仅也自动为这些“派生”表生成封装类,而且实际上将它们表示为各自父类的派生类。因此,实际上我实际上并不是在编码x,它是作为X的子类为我自动生成的。现在,我可以更精确地讲,我需要的是一个类,它确实可以完成D的所有工作,但是可以对数据库表x而不是X进行操作。

最佳答案



编号至少,没有限制,您不能触摸SpecializedClass的实现。
如果可以更改,则应这样更改:

旧代码:

template <class T>
class TemplatedClass   : public T {};
class SpecializedClass : public TemplatedClass<Foo> {};

新代码:
template <class T>
class TemplatedClass   : public T {};
template<type Base = Foo> // << HERE
class SpecializedClass : public TemplatedClass<Base> {};

由于您无法执行此操作,因此有以下可能性:
  • 滚动您自己的SpecializedClass:如您所说,将SpecializedClass复制到您自己的专业中(类似于上面的“新代码”,然后添加:using RespecializedClass = SpecializedClass<Bar>;)。然后,使用新的SpecializedizedClass(直接称为RespecializedClass?:)维护所有代码,并忽略原始库提供的代码。您必须通过以下方式将修补程序和补丁从原始代码传播到您自己的副本中:(
  • 向公司的原始维护人员提出补丁,解释您的具体需求。如果为Base提供默认模板参数,则整个公司的客户代码都可以正常工作,而无需进行任何更改。
  • 关于c++ - 是否有可能从具有特殊类型的类型的特殊类中派生并 “respecialize”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24406202/

    10-10 03:45