【问题标题】:C++ metaprogramming vs inheritance [closed]C ++元编程与继承[关闭]
【发布时间】:2016-07-10 12:21:52
【问题描述】:

我想知道当我们可以实现相同的功能目标时,使用元编程(即模板)对抗 C++ 中的继承是否有特别的优势。

例如我们可以做一些事情(我只是想出这样的例子......):

template<typename T>
class Node {
 public:
   //bla bla
 private:
  T data;
  Node* next;
  Node* prev;
};

使用类型特征,我们可以进一步限制特定类别的对象。但是我想我们可以用继承做一些非常相似的事情:

class Base {
 //bla bla
};

class Der1 : public Base {
 //bla bla
};

//.
//.
//.
class DerN : public Base {
 //bla bla
};

class Node {
 public:
  //bla bla
 private:
  Base* data;
  Node* next;
  Node* prev;
};

这样的案例有什么优势?当我们可以同时使用两者来实现同一目标时,选择其中一个或另一个的关键因素是什么?

【问题讨论】:

  • Node&lt;int&gt; 呢?
  • 显然使用模板你只需要一个类。除非您需要模板专业化
  • 对于没有运行时多态性的模板。在这种情况下,您不需要它,所以我会选择模板
  • @anderas 把它包起来......你可以找到解决方案。
  • 实际上需要两者的混合。

标签: c++ templates inheritance metaprogramming


【解决方案1】:

与许多此类问题一样,“关键因素”取决于代码的应用。

编译时间、代码复杂度或执行速度哪个更重要?

  • 如果您打算加快编译时间(由于项目大小或旧版本服务器),您想避免使用模板,对模板的每次代码更改都会重建模板头文件中的所有源文件包含在其中。
  • 如果您担心执行时间,模板通常允许您生成编译器可以针对相关类型优化的代码,但是继承允许您优化专门针对每种类型的代码(添加了 vtable 查找时间)。因此,您需要对两者的跟踪代码进行基准测试。
  • 如果您担心代码复杂性(对于大多数现代应用程序来说是最重要的),这取决于项目中其他开发人员的技能以及模板专业化的数量你会需要的。

关于最后一点,测量需要对超出此问题范围的任务有复杂的理解,但是我的建议很简单;如果您需要与类型一样多的专业化 - 请改用继承。对于像您的示例节点树这样的东西,继承类型将为普通开发人员提供更好的解决方案,但是如果您需要使用“适用于所有事物”的方法或函数(例如流&lt;&lt; 运算符)模板会更好。

tl;博士

除非您需要担心特定的处理/内存开销,否则请使用创建最少代码的那个。力求干净、清晰且易于阅读

【讨论】:

  • 不错的答案,“最少的代码”是指“编写的代码”还是“生成的”(汇编)代码?
  • 书面代码 - 如果您发现自己担心二进制产品的大小(IE:嵌入式设备),您通常会使用 C 而不是 C++。或者说,这样做更好。
【解决方案2】:

这两个概念无关。

继承仅提供运行时多态性——具体操作可以应用于任何对象,只要它是一个基础对象。

虽然通用编程允许人们根据通用概念进行编码 - 即将这种通用操作应用于这些不相关类型的对象。

用例是不同的,而且通常是互补的。 CRTP 模式就是一个例子 - 通用编程用于提供可继承接口的实现。

使用类型特征,我们可以进一步限制特定类别的对象。但是我想我们可以用继承做一些非常相似的事情:

不是在编译时,你不能。继承的主要缺点之一 - 特别是在寻求基于类型限制或专门化操作时,这必须在运行时完成 - 这意味着泛型编程的编译器错误现在变成了呈现给用户的运行时错误。

编译器错误是好的 - 在签入代码之前腐烂停止。运行时错误是邪恶的。它们的修复成本(至少)要高出两个数量级,而且它们会让您(或您的公司)看起来很糟糕。

【讨论】:

    【解决方案3】:

    模板:

    • 编译时机制(即没有运行时开销)
    • 没有多态性:Node 和 Node 是完全不同的对象,没有任何关系(因此您无法从一种类型转换为另一种)

    继承通常是一种更灵活的方法。这实际上取决于您需要实现的行为。

    【讨论】:

    • 想象一个你有同等功能行为的情况,我说的是性能。
    【解决方案4】:

    一些非常笼统的说法:在性能方面,模板的编译时间更长,动态多态的运行时间更长。

    使用模板有时在结构上更复杂。这就是为什么即使是一些性能优化的软件也没有一直使用模板。但是,我见过一些优化软件,它尽可能地使用模板,而且速度惊人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 2021-02-07
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      相关资源
      最近更新 更多