什么是c++ mixin风格?

What is C++ Mixin-Style?

本文关键字:风格 mixin c++ 什么      更新时间:2023-10-16

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

在这篇文章中,它被回答为一个设计模式。是否与本文档中描述的设计模式相同?

Mixins是一个来自Lisp的概念。多布斯博士的一个很好的解释:

mixin是一个类的片段,因为它打算与其他类或mixin组合在一起。
[…]
常规的、独立的类(比如Person)和mixin之间的区别在于,mixin建模了一些小的功能片段(例如打印或显示),而不是用于独立使用。相反,它应该与需要此功能的其他类(例如Person)组合在一起。

所以,mixin的意义就在于允许像那样的多重继承,而没有多重继承通常带来的所有坏事情。

这可能有点令人困惑,然而,因为c++本身不支持mixins;为了在c++中"做"混合,你必须使用多重继承!这最终在实践中意味着你仍然使用多重继承,但是你人为地限制了你允许自己使用它的范围。

参见上面的文章获得实际的mixin实现

如果我没记错的话,在c++中至少有两种创建mixins的方法。这是我看过的一个很老的(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();
}

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

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;
    d.g();
}

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

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

mixins通常被称为小型类(通常是模板化的或基于crtp的),您可以从中派生以"混合"某些功能;通常通过多重继承和基于策略的设计(参见Alexandrescu的"现代c++设计")。

c++中的mixin使用奇怪循环模板模式(CRTP)表示。这篇文章很好地分析了它们比其他重用技术提供了什么……编译时多态。