我正在研究mixins(C).我读了一些关于mixins的文章,发现C中有两种不同的“近似”混合模式.
模式1:
template<class Base> struct Mixin1 : public Base { }; template<class Base> struct Mixin2 : public Base { }; struct MyType { }; typedef Mixin2<Mixin1<MyType>> MyTypeWithMixins;
模式2 :(可以称为CRTP)
template<class T> struct Mixin1 { }; template<class T> struct Mixin2 { }; struct MyType { }; struct MyTypeWithMixins : public MyType,public Mixin1<MyTypeWithMixins>,public Mixin2<MyTypeWithMixins> { };
他们几乎相等吗?我想知道模式之间的实际差异.
解决方法
不同的是可见性.在第一种模式中,MyType的成员直接可见和可用于mixin,而不需要投射,Mixin1的成员对Mixin2可见.如果MyType想要从混合中访问成员,则需要对其进行转换,并且没有一个很好的安全方法.
在第二种模式中,类型和混合之间没有自动可见性,但是mixins可以安全轻松地将其转换为MyTypeWithMixins,从而访问类型和其他混合的成员. (MyType也可以,如果你也应用了CRTP).
所以归结于方便和灵活性.如果你的mixin纯粹是从类型中访问服务,并且没有自己的兄弟依赖,那么第一个模式是很好直接的.如果mixin依赖于类型或其他混合提供的服务,您或多或少被迫使用第二种模式.