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
,我已经多次想这样做了,并且得出结论,您不能这样做。我认为最方便的方法是编写一个生成委托类的脚本。@DraxFoo
可能有一些我不想向DelegatingFoo
类公开的内容。另外,DelegatingFoo
类应该包装的IFoo
类可能有多个实现。
DECLARE_INTERFACE( SCOPE, NAME )
IMPLEMENT_FORWARD( SCOPE, NAME, TARGET )