C ++ - 如何将类上的所有成员函数调用委托给同一接口的成员

时间:2017-01-20 15:07:02

标签: c++ c++11 delegates perfect-forwarding

我有一个接口和几个实现该接口的类。

我还有一个类,它只是作为一个包装器,简单地将所有调用委托给也实现该接口的成员。

#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类充当其他包装器的基类,因此这些包装器不必再次重新实现所有转发的方法。

1 个答案:

答案 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 ++代码,可能基于反射信息。