Mixin层和&静态绑定

时间:2011-06-17 09:42:38

标签: c++ layer mixins

我目前正在使用mixin图层设计,而且我一直坚持使用 恼人的问题。 让我们考虑以下基本的mixin层:

template <typename Next> 
struct Layer1 : public Next 
{ 
 struct A : public Next::A 
 { 
   void f() { g(); } 
   void g() {} 
 }; 
};

这里没什么好看的,只是一个简单的混合,有两种方法f()g()。 请注意,来自g()的{​​{1}}来电是静态绑定的 具体f()。 现在,我想要的是能够完全挂钩这个方法 用mix实现一个日志层:

Layer1::A::g()

考虑template <typename Next> struct Layer2 : public Next { struct A : public Next::A { void f() { std::cout << "Layer2::A::f() [enter]" << std::endl; Next::A::f(); std::cout << "Layer2::A::f() [leave]" << std::endl; } void g() { std::cout << "Layer2::A::g() [enter]" << std::endl; Next::A::g(); std::cout << "Layer2::A::g() [leave]" << std::endl; } }; }; ,这里的问题是任何调用 来自Layer2<Layer1<...>>以上层的f()g()将正确级联到 Layer2,从而显示正确的日志消息。但 从Layer2::A::g()下面f()g()的任何来电都不会记录任何内容 该呼叫将被静态绑定到可用的Layer2 打电话的时间。 这意味着从g()以上的任何图层调用f()显然都会 仍然始终从Layer2致电Layer1::A::g()而不显示 记录消息。 我想出了两个解决这个问题的方法:

  1. 虚拟性:显然不可接受。 mixin层的重点 是在没有必要的时候避免虚拟。

  2. 向图层添加模板参数以提供上一个 层,类似的东西。

  3. Layer1::A::f()

    嗯,它有效,但我想隐藏第二个模板 参数,因为它是多余的。 我想知道你们有没有遇到过这样的问题,以及是什么 你是否已经开发出解决方案,因为有明显的缺陷 关于mixin图层的文章。

0 个答案:

没有答案