2012-04-19 6 views
7

Si supponga che ho un'interfacciaautomatico classe proxy

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

Ho bisogno di una classe proxy, a fare una sorta di id per la mappatura puntatore

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

} 

Così, quando scrivo

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

f viene richiamato sull'oggetto con id = 1

ci sono molti di questi casi e le interfacce sono piuttosto grandi. Quindi non voglio codificare tutte le funzioni nella classe proxy. C'è un modo per farlo automaticamente? magari usando le macro, modelli, sovraccarico "->", ecc

+0

Ci sono molte interfacce si scrive lo stesso proxy, o molte classi proxy per la stessa interfaccia, o molti proxy per molte interfacce? – hansmaad

+0

è un po 'confuso: sembra così e l'istanza di I non conosce il proprio indice, ma viene a sapere quando vengono chiamati i suoi metodi f o g ... perché? design strano. Pianificherei il tutto senza mai conoscere il suo indice. Questo avrebbe senso. –

+0

@hansmaad, molti proxy per molte interfacce (one-to-one) –

risposta

4

La soluzione facile è definire un operatore-> che restituisce il puntatore all'interfaccia. Ma questo interromperà l'incapsulamento poiché tutti possono accedere direttamente ai tuoi oggetti e in realtà non hai bisogno della tua classe proxy (potresti anche usare semplicemente una std :: map).

alternativa si potrebbe fare qualcosa di simile

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

Essa si basa pesantemente su C++ 11 caratteristiche quindi potrebbe non compilare con il compilatore.

Prima utilizza i modelli Variadic. Vedere https://en.wikipedia.org/wiki/Variadic_Templates per ulteriori informazioni.

Successivamente utilizza decl_type. Vedi https://en.wikipedia.org/wiki/Decltype per ulteriori informazioni.

Devi usare in questo modo:

Proxy<I> p; 
    ... 

    p(&I::f,1); 
    p(&I::g,3, 1.); 
+0

woow! non abbiamo un compilatore compatibile con C++ 11, ma è semplicemente bellissimo! Grazie! –

+0

Puoi quindi accettare la risposta :-) – BertR

+0

beh, credo che questo è il meglio che posso ottenere :) –

0

Non so se questo è adatto per voi, ma si può prendere cura di questo usando puntatori a funzioni ...

es.

#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... 
} 
Problemi correlati