我有一个接口和几个实现该接口的类。
我还有一个类,它只是作为一个包装器,简单地将所有调用委托给也实现该接口的成员。
#include <iostream>
class IFoo {
public:
virtual void a() = 0;
virtual int b(int) = 0;
virtual bool c() = 0;
};
class Foo : public IFoo {
public:
void a() override { std::cout << "Foo::a" << std::endl; };
int b(int x) override { std::cout << "Foo::b" << std::endl;};
bool c() override { std::cout << "Foo::c" << std::endl; };
};
class Foo2 : public IFoo {
public:
void a() override { std::cout << "Foo2::a" << std::endl; };
int b(int x) override { std::cout << "Foo2::b" << std::endl;};
bool c() override { std::cout << "Foo2::c" << std::endl; };
};
class DelegatingFoo : public IFoo {
public:
DelegatingFoo(IFoo* f) : foo(f) {}
void a() override { return foo->a(); }
int b(int x) override { return foo->b(x); }
bool c() override { return foo->c(); }
private:
IFoo* foo;
};
int main() {
Foo foo;
DelegatingFoo dfoo(&foo);
dfoo.a();
dfoo.b(5);
dfoo.c();
Foo2 foo2;
DelegatingFoo dfoo2(&foo2);
dfoo2.a();
dfoo2.b(5);
dfoo2.c();
}
我想知道我是否可以简单地将DelegatingFoo的调用转发给它的foo成员,而不必定义所有重写的方法,这样如果我对IFoo接口进行更改,我就不需要完全改变DelegatingFoo类。
就我而言,DelegatingFoo类充当其他包装器的基类,因此这些包装器不必再次重新实现所有转发的方法。
答案 0 :(得分:0)
可以编写一个看起来像
的宏DEFINE_METHOD( SCOPE, NAME, RETURN_TYPE, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE )
然后
DECLARE_INTERFACE( SCOPE, NAME )
IMPLEMENT_FORWARD( SCOPE, NAME, TARGET )
但你不应该。
我不会教你如何。如果你想知道其他人是如何做类似的事情,那就去master boost的预处理器库吧。黑客是邪恶的,代码更糟糕,结果很难维护,几乎无法调试。
现在,正在努力为C ++标准添加反射和具体化。反思很可能首先在C ++ 20或C ++ 2 *中出现。可能会在以后发生。你想要什么似乎需要两者。
您可以使用反射操作编译时数据结构,例如C ++中的接口(它们也计划在编译时执行此操作)。可以在Reification中生成新的C ++代码,可能基于反射信息。