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

时间:2011-04-15 12:33:05

标签: c++ mixins

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

我想在根类中添加一个方法,并可能在某些子代中覆盖它。 但问题是我禁止修改这些现有的课程(第三方图书馆,项目政策,封闭源等)。

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

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

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

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

不要忘记:我最终无法更改原始类(既不是标题也不是实现)。

3 个答案:

答案 0 :(得分:2)

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

改变vtable似乎是一个非常糟糕的主意,它显然是不可移植的,并且假设你有点知道它的物理布局......即使你做对了也会成为维护的噩梦。

我非常喜欢std::map<type_info, Func>的想法。 std::type_info::before为您提供实施所需的一切(不要依赖于名称或地址)。

答案 1 :(得分:2)

实际上我正在编写一个可以实现这一目的的库:允许您在运行时从现有类中编写和修改类型,其成本是无法将方法调用为方法,而是作为外部函数第一个参数this。它是非侵入式的,因此您无需以任何方式修改现有类。

代码:https://github.com/iboB/boost.mixin

Doc:http://ibob.github.io/boost.mixin/

希望它有所帮助。

PS。它被称为Boost.Mixin,因为我打算将它提交给Boost,但它还不是Boost的一部分。

答案 2 :(得分:1)

写一个免费的功能。

void vfunc(base& param);

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

deriv0 d0;
vfunc(d0);