自动代理类
假设我有一个接口
class I{
public:
virtual void f(int id)=0;
virtual void g(int id, float x)=0;
}
我需要一个代理类来做一些id到指针的映射
class Proxy : I
{
I * i[5];
public:
void f(int id)
{
i[id]->f(id);
}
void g(int id, float x)
{
i[id]->g(id, x);
}
}
所以当我写
Proxy *p;
p->f(1);
在id = 1的对象上调用f
有几种这样的情况和接口相当大。 所以我不想编写代理类中的所有函数。 有没有办法自动做到这一点? 也许使用宏,模板,重载“ - >”等。
简单的解决方案是定义一个operator->,它返回指向接口的指针。 但是这会破坏你的封装,因为每个人都可以直接访问你的对象,而你实际上不需要你的代理类(你可能只是使用std :: map)。
另外,你可以做类似的事情
template <typename Interface>
class Proxy
{
Interface* interfaces[5];
public:
template <typename F, typename... Params>
auto operator()(F f, const int id, Params... parameters)
-> decltype((interfaces[id]->*f)(id, parameters...))
{ return (interfaces[id]->*f)(id, parameters...); }
};
它很大程度上依赖于C ++ 11的特性,所以它可能无法在编译器中编译。
首先它使用Variadic模板。 有关更多信息,请参阅https://en.wikipedia.org/wiki/Variadic_Templates。
接下来它使用decl_type。 有关更多信息,请参阅https://en.wikipedia.org/wiki/Decltype。
你必须像这样使用它:
Proxy<I> p;
...
p(&I::f,1);
p(&I::g,3, 1.);
我不知道这是否适合你,但你可以使用函数指针来照顾这个...
即。
#include <stdio.h>
typedef void (*f)(int);
void f1(int a)
{
printf("f1: %dn", a);
}
void f2(int a)
{
printf("f2: %dn", a);
}
int main(int argc, char *argv[])
{
f array[5] = {NULL}; // create array of pointers
array[0] = f1; // assign different functions on them
array[1] = f2; // -||-
array[0](10); // call them
array[1](12);
// and you end up with something like "array[i]();" in your proxy class...
}
链接地址: http://www.djcxy.com/p/58995.html