什么是c++ mixin风格?
What is C++ Mixin-Style?
我刚刚遇到了这个关键词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)表示。这篇文章很好地分析了它们比其他重用技术提供了什么……编译时多态。
- Qt VTK交互风格的信号到小部件
- 我可以使用条件运算符初始化C风格的字符串文字吗
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 重载运算符<<采用谷歌 C++ 风格
- C++许多 SFINAE 风格的过载
- 根据参数数调用 mixin 基类的构造函数
- 谷歌风格指南(前向分枝部分)
- 如何使用 cmake pack redhat 风格的 rpm,这是主要的和"-devel"?
- 如何用符合C++核心准则的代码替换C风格的字符串解析
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 用现代C++STL数据结构替换旧的C风格数组
- 如何确保 C/C++ 代码中不会缺少 doxygen 风格的文档注释?
- 在C++中使用#include宏实现mixin模式好吗
- C++(Visual Studio)有Java风格的注释吗?
- 如何"Re-Polish"相同风格的QApplication?
- 如何按照 Google C++风格指南连接字符串文字?
- 如何为特定的构建风格设置 cpp 文件夹
- 使用 rangesv3 在 c++ 中模拟 python 风格的列表理解?
- 什么是c++ mixin风格?