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

C++ C++;-如何将类上的所有成员函数调用委托给同一接口的成员,c++,c++11,delegates,perfect-forwarding,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::c

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

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

#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();
}
#包括
类IFoo{
公众:
虚空a()=0;
虚拟整数b(整数)=0;
虚拟布尔c()=0;
};
Foo类:公共IFoo{
公众:

void a()override{std::cout可以编写一个如下所示的宏

DEFINE_METHOD( SCOPE, NAME, RETURN_TYPE, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE )
然后

但你不应该

我不会教你怎么做。如果你想知道其他人是如何做类似的事情的,去master boost的预处理器库吧。这些黑客是邪恶的,代码更糟糕,结果很难维护,几乎不可能调试

现在,有一个工作正在向C++标准中添加反射和化。反射可能首先到达,在C++ 20或C++ 2中。可能会发生事后化。你想要的东西都需要两者。


反射是你可以在编译时数据结构中操作的,比如C++中的接口(它们也计划在编译时这样做)具体化是在哪里生成新的C++代码,可能是基于反射信息的。

取决于为什么<代码>委托FoO < /代码>存在,它添加了什么?<代码>委派FoO < /C> >和<代码> Foo<代码>之间的区别是什么?在我的例子中,它作为其他包装的基类,因此它们不必重新使用。再次实现所有这些函数。为什么不直接从
Foo
继承呢?目前您的
DelagatingFoo
基本上就是一个指针,指向
Foo
,我已经多次想这样做了,并且得出结论,您不能这样做。我认为最方便的方法是编写一个生成委托类的脚本。@Drax
Foo
可能有一些我不想向
DelegatingFoo
类公开的内容。另外,
DelegatingFoo
类应该包装的
IFoo
类可能有多个实现。
DECLARE_INTERFACE( SCOPE, NAME )
IMPLEMENT_FORWARD( SCOPE, NAME, TARGET )