编译时类继承

Compile-time class inhertiance

本文关键字:继承 编译      更新时间:2023-10-16

假设给定两个类AB,它们的接口事先是未知的。目标是在编译时AB一般地"组合"成一个名为AB的新类。

通过组合,我的意思是所有成员函数和所有成员变量以及AB的所有类型都以相同的实现出现在AB中。经典的类继承是不够的;我需要在编译时使用它,因为在我的应用程序中,运行时调度的成本非常高。天真的解决方案是为每个类创建一个实例并转发任何调用;但是,这不是泛型的,因为我们假定接口没有预先固定。

如果有帮助的话,使用c++ 11的概念是可以的。AB接口冲突时出现编译错误是可以接受的。

的背景

类实现基于一些外部数据的实用函数,并作为模板参数传递。有几个经常使用的典型实用程序,我想提出(类A, B, C),但并非所有都适用(例如,如果只有AB适用,那么我想使用实用程序AB)。代码非常底层,实用程序函数经常在时间临界循环中调用

对于非虚函数,继承不会产生运行时开销。因此,简单地不要AB的任何成员声明为virtual,编译器将不会创建虚函数表。

一个简单的例子是

struct A { void f() { /* ... */ } };
struct B { void g() { /* ... */ } };
struct AB : public A, public B { };  // Provides both f and g.

的被害者。,如果AB重叠,编译器会报错为歧义。

(这个答案是根据评论给出的,为了完整起见;感谢评论员)

我相信这已经在其他地方解决了-您正在寻找的是静态继承。实现这一点的两种模式是基于策略的设计和奇怪的循环模板。注意重载问题。

#include <iostream>
using namespace std;
class A
{
public:
  int a;
  A() : a(0) {}
  int foo_A() { return a; }
};
class B
{
public:
  int b;
  B() : b(1) {}
  int foo_B() { return b; }
};
template<class stinh1, class stinh2>
class AB : public stinh1, public stinh2
{
};

int main()
{
  AB<A,B> ab;
  cout << ab.foo_A() << endl << ab.foo_B() << endl;
  ab.a = 2;
  ab.b = 3;
  cout << ab.foo_A() << endl << ab.foo_B() << endl;
}

继承是一种方法(可能是更可取的方法)。如果a和B包含具有签名(相同名称和相同参数)的方法,您将遇到一个小问题,如果事先不了解API,这很难克服。您可以尝试静态分析代码,让程序将代码读取为文本,解析API并创建两个API组合的新文本,您将需要决定如何处理相同的签名问题(您调用两者吗?什么顺序?等")。这个解决方案要困难得多,也更容易出错。