我目前正在使用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()
而不显示
记录消息。
我想出了两个解决这个问题的方法:
虚拟性:显然不可接受。 mixin层的重点 是在没有必要的时候避免虚拟。
向图层添加模板参数以提供上一个 层,类似的东西。
Layer1::A::f()
嗯,它有效,但我想隐藏第二个模板 参数,因为它是多余的。 我想知道你们有没有遇到过这样的问题,以及是什么 你是否已经开发出解决方案,因为有明显的缺陷 关于mixin图层的文章。