什么是C + +混合风格?

我刚刚遇到了这个关键字C++ Mixin-Style ,有谁知道这是什么?

在这篇文章中 ,已经被作为devise模式回答了。 它是否与本文档中描述的devise模式相同?

Mixin是Lisp的一个概念。 Dobbs博士的一个很好的解释:

mixin是一个类的片段,意思是它要与其他类或混合类组成。
[…]
一个普通的独立类(如Person)和一个mixin之间的区别在于一个mixin对一些小function片进行build模(例如,打印或显示),而不是单独使用。 相反,它应该与其他一些需要此function的类组成(例如,Person)。

所以,mixin的意义在于允许多重inheritance这样的东西,而没有所有通常伴随着多重inheritance的Bad Things™。

然而,这可能有点混乱,因为C ++本身不支持mixin; 为了在C ++中“做”mixins,你必须使用多重inheritance! 这实际上意味着你仍然使用多重inheritance,但是人为地限制你允许自己使用它。

看到上面的文章实际混合实现。

如果我没有记错,至less有两种方法可以在C ++中创buildmixin。 这来自我见过的一些非常古老的(1995年)教程(但现在几乎已经完全从互联网上消失了)。

第一,

 class MixinBase { public : void f() {}; }; template<class T> class Mixin : public T { public: void f() { T::f(); T::f(); } }; template<class T> class Mixin2 : public T { public : void g() { T::f(); T::f(); } }; int main() { Mixin2<Mixin<MixinBase>> mix; mix.g(); } 

或者另一种方式使用虚拟inheritance和兄弟调用:

 class Base { public : virtual void f() = 0; }; class D1 : public virtual Base { public : void g() { f(); } }; class D2 : public virtual Base { public : void f() { } }; class D : public D1, public D2 { }; int main() { D d; dg(); } 

现在这两个版本都实现了mixin,因为Mixin和Mixin2是独立的类,但是它们仍然可以通信。 你可以用这种模块创build软件,然后把这些模块绑定到一个大的软件上。 在虚拟inheritance中,D1和D2之间也是如此。 需要注意的是,在mixindevise中,不同的模块位于同一个c ++对象内部。 (哦和CRTP是不同的技术)

Mixin是一个类(或其他代码组),通过直接包含在另一段代码中来重用。 把它看作是没有子types多态性的inheritance。 CRTP是一种用C ++近似Mixins的方法。

通常mixin被称为小类(通常是基于模板的或基于crtp的),可以用来“混合”某些function; 通常通过多重inheritance和基于策略的devise(也参见Alexandrescu的“Modern C ++ Design”)。

C ++中的Mixin使用奇怪的循环模板模式 (CRTP)来表示。 这篇文章是他们提供的优于其他重用技术的细分…编译时多态性。