为什么C++中的模板mixin不再是主流?

Jes*_*per 16 c++ performance templates mixins reusability

我在C++中使用模板mixins很多,但我想知道为什么这个技术不再使用.它似乎是最终的重用.这种权力和效率的结合是我真正喜欢C++的原因之一,并且无法看到自己转向JIT语言.

这篇文章:http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_good是一个很好的背景,如果你不知道它们是什么,并在重用方面如此清楚地说明和表现.

Mat*_* M. 21

mixin的问题是......构造.

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

class Base2 { public: Base2(Special const&, Special const&); };
Run Code Online (Sandbox Code Playgroud)

现在,我的超级混音:

template <typename T>
struct Mixin: T {};
Run Code Online (Sandbox Code Playgroud)

你注意到这个问题吗?我到底该如何将参数传递给基类的构造函数?应该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...)) {}
};
Run Code Online (Sandbox Code Playgroud)

注意:欢迎双重检查

所以现在我们可以真正使用mixins ......而且只需改变人们的习惯:)

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

mixins的问题之一(你引用的可怜的文章跳过了)是你完全失去的依赖隔离......以及LoggingTask然后绑定用户编写模板方法的事实.在非常大的代码库中,依赖性比性能更受关注,因为依赖性会消耗人为循环,而性能只会消耗CPU周期......而且这些通常会更便宜.

  • @Skizz您刚刚回答了自己的问题.RAII更受欢迎,被认为非常有用. (3认同)
  • @TonyDelroy:哦,相信我的人都试过了.鉴于`const`,`volatile`和`&`vs"value"的组合,它很快变得难以处理.当然,对于"一个"特定情况,它可能工作得很好,总的来说虽然很难.当然,如较大段落所述,虽然现在技术上可行,但由于其他原因,它可能仍然不可取. (2认同)

Ton*_*roy 5

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

此外,每个模板实例化创建一个不同的类型,这意味着用于任何模板实例的函数必须能够接受它们 - 要么自己被强制模板化,要么它们需要一种切换到运行时多态性的形式(通常很容易做到:只需要一个表示支持操作集的抽象基类,以及一些"get me a accessor"函数,它返回一个派生对象,其指针指向虚拟调度表中的模板实例和相关的entires) .

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