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

问题描述

| 考虑一个现有的C ++类层次结构:一个根类,许多子类构成一个直接的非循环图。 我想向根类添加一个方法,并可能在某些子类中重写它。但是问题是我被禁止修改这些现有的类(第三方库,项目策略,封闭源代码等)。 混合/扩展类将是一个很好的解决方案。但这在C ++中并不可行。 快速而肮脏的解决方案是使用以下方法编写一个分派对象类型的函数: dynamic_cast运算符,并对每种类型的层次结构执行所需的代码。但这有点不好,因为 它容易出错,会破坏封装,并且不安全地支持将来的更改。 我正在考虑使用定义{rtti type id,要调用函数} \“来维护某种哈希表,并将其用作 我要编写和覆盖的函数的虚假VTable。但是我不确定是否会更好... 还有其他想法吗?运行时VTable更改?模板元编程解决方案?其他? 别忘了:我绝对不能更改原始类(标头和实现都不能)。     

解决方法

如果您不能更改原始层次结构,则模板元编程不太可能有所帮助。请记住,它基于编译时信息。 更改vtable似乎是一个非常糟糕的主意,这显然是不可移植的,并且假定您对它的物理布局有所了解...即使正确使用它也是维护的噩梦。 我很喜欢
std::map<type_info,Func>
的主意。
std::type_info::before
为您提供实施所需的所有内容(不必依赖名称或地址)。     ,实际上,我正在编写一个做到这一点的库:允许您在运行时编写和修改现有类中的类型,但代价是无法将方法调用为... er方法,而是将其作为外部函数使用。
this
。它是非侵入式的,因此您无需以任何方式修改现有的类。 代码:https://github.com/iboB/boost.mixin Doc:http://ibob.github.io/boost.mixin/ 希望能帮助到你。 PS。之所以称为Boost.Mixin,是因为我打算将其提交给Boost,但它还不是Boost的一部分。     ,编写一个免费函数。
void vfunc(base& param);

// ...
base b;
vfunc(b);

deriv0 d0;
vfunc(d0);
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...