what know how are c++ templates design-patterns macros proxy-classes

c++ - know - Clase automática de proxy



windows 10 get proxy settings (2)

La solución fácil es definir un operador-> que devuelve el puntero a la interfaz. Pero esto romperá su encapsulamiento ya que todos pueden acceder a sus objetos directamente y usted realmente no necesita su clase proxy (también podría usar un std :: map).

Alternativa, podrías hacer algo como

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...); } };

Se basa en gran medida en las características de C ++ 11 por lo que podría no compilarse con su compilador.

Primero usa las plantillas Variadic. Consulte https://en.wikipedia.org/wiki/Variadic_Templates para obtener más información.

Luego usa decl_type. Consulte https://en.wikipedia.org/wiki/Decltype para obtener más información.

Tienes que usarlo así:

Proxy<I> p; ... p(&I::f,1); p(&I::g,3, 1.);

Suponer que tengo una interfaz

class I{ public: virtual void f(int id)=0; virtual void g(int id, float x)=0; }

Necesito una clase proxy, para hacer algún tipo de mapeo de identificación a puntero

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); } }

Entonces cuando escribo

Proxy *p; p->f(1);

f se invoca al objeto con id = 1

hay varios casos similares y las interfaces son bastante grandes. Así que no quiero codificar todas las funciones en la clase de proxy. ¿Hay forma de hacerlo automáticamente? tal vez usando macros, plantillas, sobrecarga "->" etc.


No sé si esto es adecuado para ti, pero podrías ocuparte de esto usando punteros a funciones ...

es decir.

#include <stdio.h> typedef void (*f)(int); void f1(int a) { printf("f1: %d/n", a); } void f2(int a) { printf("f2: %d/n", 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... }