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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...