什么是C++ Mixin-Style?

Bit*_*map 35 c++ mixins

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

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

Blu*_*eft 20

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

mixin是一个类的片段,意思是它要与其他类或mixin组合.
[...]
常规的独立类(例如Person)和mixin之间的区别在于mixin模拟一些小功能片(例如,打印或显示),而不是用于独立使用.相反,它应该由一些需要此功能的其他类组成(例如,Person).

所以,一个mixin的要点是允许的东西一样多继承,没有所有不好的事情™,通常伴随着多重继承来的.

然而,这可能有点令人困惑,因为C++本身不支持mixins; 为了在C++中"做"mixins,你必须使用多重继承!这最终意味着在实践中你仍然使用多重继承,但你通常会限制你允许自己使用它的东西.

请参阅上面的文章,了解实际的mixin实现.


tp1*_*tp1 15

如果我没记错,至少有两种方法可以在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();
}
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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


Man*_*rse 8

Mixin是一个类(或其他代码组),旨在通过直接包含在另一段代码中来重用.将其视为没有子类型多态的继承.CRTP是一种在C++中逼近Mixins的方法.


Pla*_*aHH 5

通常 mixin 被称为小类(通常是模板化的或基于 crtp 的),您可以从中派生出“混合”某些功能;通常通过多重继承和基于策略的设计(另请参阅 Alexandrescu 的“现代 C++ 设计”)。

  • @pst,您知道 84% 的统计数据是现场制作的吗?每次我看到 mixin,无论是否使用 CRTP,它都在使用多重继承。我认为这就是 *mix* 的含义,它的意思是与其他基类混合。 (4认同)
  • 根据 Jim Coplien 在他的 *Advanced C++* mix-ins 中的说法,Flavors 语言中存在一种动态多重继承形式,您可以在其中在运行时组合多个基类以创建特定的派生类。 (2认同)

Jes*_*per 5

C++中的Mixins使用Curiously Recurring Template Pattern(CRTP)表示. 这篇文章很好地分析了它们提供的其他重用技术......编译时多态性.