C中有两种不同的mixin模式. (mixin?CRTP?)

前端之家收集整理的这篇文章主要介绍了C中有两种不同的mixin模式. (mixin?CRTP?)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在研究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依赖于类型或其他混合提供的服务,您或多或少被迫使用第二种模式.

猜你在找的C&C++相关文章