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周期......而且这些通常会更便宜.
模板要求实现在翻译单元中可见,而不仅仅是在链接时(C++ 11地址,如果您只使用指针或对实例化的引用).这是企业环境中低级代码的一个主要问题:对实现的更改将触发(可能会或可能不会自动)大量库和客户端重新编译,而不仅仅需要重新编译.
此外,每个模板实例化创建一个不同的类型,这意味着用于任何模板实例的函数必须能够接受它们 - 要么自己被强制模板化,要么它们需要一种切换到运行时多态性的形式(通常很容易做到:只需要一个表示支持操作集的抽象基类,以及一些"get me a accessor"函数,它返回一个派生对象,其指针指向虚拟调度表中的模板实例和相关的entires) .
无论如何,这些问题通常是可管理的,但是管理耦合,依赖关系和接口的技术比简单的mixin技术本身更少公开,理解和容易获得.模板和策略类BTW也是如此.
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |