【问题标题】:Define large number of interface implementations定义大量接口实现
【发布时间】:2016-06-12 20:09:51
【问题描述】:

假设我有一个带有两种方法的简单接口:

class iface {
public:
  virtual void foo() = 0;
  virtual void bar() = 0;
};

现在我想定义该接口的大量实现,但类声明的唯一区别是名称。因此,这意味着没有额外的方法、变量或其他 protected 表达式。

例如:

class bar1 : public iface {
public:
  void foo();
  void bar();
};

class bar2 : public iface {
public:
  void foo();
  void bar();
};

等等,直到 barN,其中 N 可能是大约 50-60 个类。

显然,实现都会有所不同,但仍然存在标题中存在大量样板定义的问题。如果可能的话,我希望能够以某种方式避免一遍又一遍地定义这些类。我在想也许我可以使用宏或模板来自动生成,这样我就可以将列表bar3 中的下一个类输入到一个函数中,该函数将生成可以编译和链接的代码。但是,我正在阅读,我想不建议将宏类定义用于调试目的。模板直观地感觉像是一个可能的解决方案,但我仍然需要在某个地方定义模板。

【问题讨论】:

  • 用你选择的脚本语言编写一个小脚本,输出一个格式正确的头文件,也许?
  • @Brian 您可能过于简化了您的示例。实际上应该是什么模板参数?类型参数还是非类型参数?
  • boost 预处理器库可能可以做到这一点。
  • 我可能遗漏了一些东西,但我真的不明白制作某种自动化/宏观解决方案会给你带来什么。您仍然必须输入不同的名称并为每个类编写成员函数。所以我怀疑 cut'n'paste 会尽可能高效。
  • @Galik 剪切和粘贴是定义一个选项,我并不反对。然而,尽管我认为我对自己的要求了解多少,但它们在未来仍可能会发生变化。假设我想在我的界面中添加另一个纯虚拟方法。有没有更好的方法自动更新类开销?你说得对,我必须编写实现,但无论如何也没有办法。总体而言,脚本编写方法似乎不太容易出错,并且更能适应变化。

标签: c++ templates macros polymorphism


【解决方案1】:

如果您的问题真的这么简单(即,没有过度简化),那么您可能只需执行以下操作:

template<int i,
   typename std::enable_if_t< (i >= 0 && i < 50) > // this line is very much optional
>
class bar : public iface {
public:
  void foo();
  void bar();
};

我还建议在任何地方用虚拟和/或覆盖标记 foo() 和 bar()。如果您还想简化实现,那么您可能首先将(从虚拟覆盖)委托给模板函数,但一些额外的信息将有助于进一步详细说明。

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2017-07-09
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多