为什么C++中的模板混合插件不是主流

Why are template mixins in C++ not more of a mainstay?

本文关键字:插件 混合 C++ 为什么      更新时间:2023-10-16

我在C++中经常使用模板混合,但我想知道为什么没有更多地使用该技术。这似乎是重复使用的终极目的。这种能力和效率的结合是我真正喜欢C++的原因之一,我不认为自己会转向JIT语言。

本文:http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_good是一个很好的背景,如果你不知道它们是什么,并且在重用和性能方面非常清楚。

mixin的问题是…构造。

class Base1 { public: Base1(Dummy volatile&, int); };
class Base2 { public: Base2(Special const&, Special const&); };

现在,我的超级混音:

template <typename T>
struct Mixin: T {};

你注意到这里的问题了吗?我到底该怎么把参数传递给基类的构造函数呢?Mixin应该提出什么样的构造函数?

这是一个难题,直到C++11增强了语言以获得完美的转发,它才得到解决。

// std::foward is in <utility>
template <typename T>
struct Mixin: T {
  template <typename... Args>
  explicit Mixin(Args&&... args): T(std::forward<Args>(args...)) {}
};

注意:欢迎双重检查

所以现在我们真的可以使用mixin。。。只需要改变人们的习惯:)

当然,我们是否真的想要是一个完全不同的主题。

mixin的一个问题(你引用的那篇糟糕的文章很乐意跳过)是你完全失去了依赖隔离。。。以及CCD_ 2的用户随后被绑定来编写模板方法的事实。在非常大的代码库中,依赖关系比性能更受关注,因为依赖关系消耗人力周期,而性能只消耗CPU周期。。。而且这些通常更便宜。

模板要求实现在翻译单元中是可见的,而不仅仅是在链接时(如果您只使用指针或引用实例化,C++11会解决这个问题)。这是企业环境中低级代码的一个主要问题:对实现的更改将触发(可能是自动的,也可能不是自动的)大量库和客户端重新编译,而不仅仅需要重新链接。

此外,每个模板实例化都会创建一个不同的类型,这意味着用于任何模板实例化的函数都必须能够接受它们——要么它们自己被强制模板化,或者他们需要一种形式的切换到运行时多态性(这通常很容易做到:只需要一个抽象基类来表达一组支持的操作,以及一些"给我一个访问器"函数,该函数返回一个派生对象,该对象带有指向虚拟调度表中模板实例化和相关实体的指针)。

无论如何,这些问题通常是可管理的,但管理所涉及的耦合、依赖关系和接口的技术比简单的混合技术本身要公开、理解和容易获得得多。模板和策略类BTW.也是如此。