c++ - 如何在 C++ 中表示基本的 Mixin 行为

标签 c++ mixins

考虑一个现有的 C++ 类层次结构:一个根类,许多子类形成有向无环图。

我想向根类添加一个方法,并可能在某些子类中覆盖它。 但问题是我禁止修改这些现有类(第 3 方库、项目策略、封闭源代码等)。

混合/扩展类将是一个很好的解决方案。但这在 C++ 中并非易事。

快速而肮脏的解决方案是编写一个函数来调度对象的类型,使用 dynamic_cast 运算符,并对层次结构的每种类型执行所需的代码。但这是一种不好的做法,因为 它容易写错,它破坏了封装,并且不支持安全的 future 更改。

我正在考虑在某处使用定义 {rtti type id, function to call}"维护某种哈希表,并将其用作 一个假 VTable 用于我要编写和覆盖的函数。但我不确定它是否会更好......

还有其他想法吗?运行时 VTable 更改?模板元编程解决方案?其他?

不要忘记:我绝对不能更改原始类(无论是 header 还是实现)。

最佳答案

如果您不能改变原始层次结构,那么模板元编程不太可能有所帮助。请记住,它基于编译时信息。

更改 vtable 似乎是一个非常糟糕的主意,它显然是不可移植的,并且假定您对它的物理布局有所了解......即使您做对了,这也将是一场维护噩梦。

我很喜欢 std::map<type_info, Func>主意。 std::type_info::before为您提供实现所需的一切(不要依赖名称或地址)。

关于c++ - 如何在 C++ 中表示基本的 Mixin 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5676776/

相关文章:

c++ - 在键盘箭头键上禁用 QSlider 的 valueChanged

c++ - 强类型枚举的模板化运算符

c++ - 是否有按值传递类对象的标准程序?

json4s 无法使用 mixin 特征序列化案例类

Ruby——确保局部变量不与方法名称冲突

css - LESS 行为中的嵌套 mixin

javascript - 有没有办法将 Proxy 对象绑定(bind)到 ES6 类构造函数?

c++ - C++中的IF嵌套

css - Mixins:仅将参数传递给第三个参数

C++ POCO - 如何美化一个JSON?